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

Sql JPA命名查询匹配in子句中的元组列表,sql,hibernate,jpa,spring-data-jpa,named-query,Sql,Hibernate,Jpa,Spring Data Jpa,Named Query,spring数据jpa 1.4.3与Oracle 11g 我有这样一个实体: class LinkRecord { String value; int linkType; ... } 我使用(value,linkType)作为复合索引。 对于给定的(v,t)元组列表,我们需要选择数据库中的所有记录,以便value=v,linkType=t 基本上,我想构建这个查询: SELECT * FROM LINK_RECORD WHERE (VALUE, LINK_TYPE) IN (('v

spring数据jpa 1.4.3与Oracle 11g

我有这样一个实体:

class LinkRecord {
  String value;
  int linkType;
  ...
}
我使用(value,linkType)作为复合索引。 对于给定的(v,t)元组列表,我们需要选择数据库中的所有记录,以便value=v,linkType=t

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

SELECT * FROM LINK_RECORD WHERE (VALUE, LINK_TYPE) IN (('value1', 0), ('value2', 25), ...)
其中in子句中的列表作为参数传入

因为我们处理的是大量数据,所以逐个查询元组是非常不可取的

在我的存储库中,我尝试了以下方法:

@Query("select r from LinkRecord r where (r.value, r.linkType) in :keys")
List<LinkRecord> findByValueAndType(@Param("keys")List<List<Object>> keys);
@Query(“从LinkRecord r中选择r,其中(r.value,r.linkType)位于:keys中”)
列出findByValueAndType(@Param(“键”)列表键);
其中,keys是(长度为2的列表)的列表。这就得到了ORA_00920:无效的关系运算符


是否有任何方法可以使用命名查询来实现此功能?或者我必须求助于原生sql吗?

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

实体

@实体
@命名查询({
@NamedQuery(name=“Article.findByIdAndAccessId”,query=“根据a.articlePk.Article按(:articlePks)顺序从a.articlePk所在的a.articlePk中选择a”)
})
@表(name=“ARTICLE”)
公共类文章实现了可序列化
{
私有静态最终长serialVersionUID=1L;
@嵌入ID
private ArticlePk ArticlePk=新建ArticlePk();
@列(名称=“艺术金额”)
私人浮动金额;
@列(名称=“艺术单位”)
专用字符串单元;
公共物品()
{
}
//更多代码
}
PK类

@可嵌入
公共类ArticlePk实现可序列化
{
私有静态最终长serialVersionUID=1L;
@专栏(name=“art_article”)
私人物品;
@列(name=“艺术与会计标识符”)
专用长标识符;
公共物品pk()
{
}
public ArticlePk(字符串文章,长标识符)
{
this.article=物品;
this.identifier=标识符;
}
@凌驾
公共布尔等于(对象其他)
{
if(this==其他)
{
返回true;
}
如果(!(ArticlePk的其他实例))
{
返回false;
}
ArticlePk castOther=(ArticlePk)其他;
返回this.article.equals(castOther.article)和this.identifier.equals(castOther.identifier);
}
@凌驾
公共int hashCode()
{
最终整数素数=31;
int hash=17;
hash=hash*prime+this.article.hashCode();
hash=hash*prime+this.identifier.hashCode();
返回散列;
}
//更多代码
}
由…调用

typedqueryqueryarticle=entityManager.createNamedQuery(“Article.findByIdAndAccessId”,Article.class);
setParameter(“articlePks”,articlePks);
List articles=queryArticle.getResultList();
在哪里

articlePks
列表