当前位置: 首页 > 知识库问答 >
问题:

JPA命名查询匹配in子句中的元组列表

魏彦
2023-03-14

我有这样一个实体:

class LinkRecord {
  String value;
  int linkType;
  ...
}

我正在使用(value,linkType)作为一个复合索引。对于给定的(v,t)元组列表,我们需要选择DB中的所有记录,使value=v,linkType=t。

基本上,我想构建这个查询:

SELECT * FROM LINK_RECORD WHERE (VALUE, LINK_TYPE) IN (('value1', 0), ('value2', 25), ...)
@Query("select r from LinkRecord r where (r.value, r.linkType) in :keys")
List<LinkRecord> findByValueAndType(@Param("keys")List<List<Object>> keys);

共有1个答案

顾梓
2023-03-14

答案已经太迟了,但也许其他人也有同样的问题。这是我的一个工作例子。这里我需要搜索与给定复合键匹配的所有条目:

实体....

@Entity
@NamedQueries({
    @NamedQuery(name = "Article.findByIdAndAccessId", query = "SELECT a FROM Article a WHERE a.articlePk IN (:articlePks) ORDER BY a.articlePk.article")
})
@Table(name = "ARTICLE")
public class Article implements Serializable
{
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private ArticlePk articlePk = new ArticlePk();

    @Column(name = "art_amount")
    private Float amount;

    @Column(name = "art_unit")
    private String unit;

    public Article()
    {
    }

    //more code
}

PK类....

@Embeddable
public class ArticlePk implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Column(name = "art_article")
    private String article;

    @Column(name = "art_acc_identifier")
    private Long identifier;

    public ArticlePk()
    {
    }

    public ArticlePk(String article, Long identifier)
    {
        this.article = article;
        this.identifier = identifier;
    }

    @Override
    public boolean equals(Object other)
    {
        if (this == other)
        {
            return true;
        }
        if (!(other instanceof ArticlePk))
        {
            return false;
        }

        ArticlePk castOther = (ArticlePk)other;
        return this.article.equals(castOther.article) && this.identifier.equals(castOther.identifier);
    }

    @Override
    public int hashCode()
    {
        final int prime = 31;
        int hash = 17;
        hash = hash * prime + this.article.hashCode();
        hash = hash * prime + this.identifier.hashCode();

        return hash;
    }

    //more code
}
TypedQuery<Article> queryArticle = entityManager.createNamedQuery("Article.findByIdAndAccessId", Article.class);
queryArticle.setParameter("articlePks", articlePks);
List<Article> articles = queryArticle.getResultList();
 类似资料:
  • 我有一个类Api,它包含一个数据列表:

  • 问题内容: 这个有点奇怪。我正在尝试运行以下查询联接3个表。 上面的查询返回以下错误 但是,如果我更改它,以便group by子句中的所有内容都在order by子句中,那么它将起作用。 究竟是什么原因呢? 我认为问题可能是因为第一个查询的语句中显示的t2.id不是该语句的一部分。如果这是原因,那为什么重要呢?我以前从未经历过这种情况,并且认为group by和order by语句之间没有任何关系

  • 问题内容: 我们正在开发一个使用EJB连接到数据库的Web应用程序。 在我们的数据库模型中,我们有一个移动设备表,另一个有功能表,最后一个有手机模型映射功能值的表。模型(id_model,…)功能(id_feature,…)model_features(id_model,id_feature,值) 我们想要执行一个查询,以按匹配特征的数量对模型进行排序。就是说,我们传递了一个要匹配的功能列表(即从

  • 问题内容: 有没有办法确保子句中的所有值都匹配? 例: 我可以将IN用作:。 我需要它像跨多个行一样工作。 更新: 我需要它来列出数据库中符合指定参数的公司。公司和分类法之间存在很多关系。我正在使用Yii框架。这是我的控制器的代码: 问题答案: 您可以执行以下操作: 如果您提供架构和一些示例数据,我可以提供一个更相关的答案。 SQL小提琴示例

  • 问题内容: 我们正在将JPA与hibernate用作提供程序,我们有一个查询,该查询包含一个与FROM子句中的子查询的联接,但是会出现以下错误: org.hibernate.hql.ast.QuerySyntaxException:意外令牌:(在第1行第75列附近[SELECT sd from com.hp.amber.datamodel.entities.analysis.SnapshotDat

  • 问题内容: 我如何添加WHERE IN语句,如… 在实体框架中 问题答案: 用途: 或在查询语法中: