JPA标准:在多列子句中

ee7vknir  于 2023-10-19  发布在  其他
关注(0)|答案(3)|浏览(96)

我尝试使用JPA Criteria API编写以下SQL查询

SELECT * FROM Table1 a
WHERE (a.category, a.priority) IN (
SELECT a1.category, max(a1.priority) FROM Table1 a1 GROUP BY a1.category
)

从功能上讲,查询为每个类别选择表1中具有最高优先级的元素。

categoryPriority = // defines the pair category/priority
mySubQuery = // defines the subquery
query.where(categoryPriority.in(mySubQuery)

这就是我要找的示意图。
定义子查询不是问题,因为它有很好的文档记录。
但我找不到一种方法来定义这对夫妇(a.类别,a.优先级)。

v1l68za4

v1l68za41#

JPA中不提供IN子句中的多列。我认为你需要使用原生查询。
参考:query for select which multiple values in the “IN” clause

knsnq2tg

knsnq2tg2#

另一种方法是使用字段串联
创建一个方法,返回要在DTO/Entity中搜索的两个字段。

public String getField1Field2Concatenated() {
    return field1+ field2;
  }

List<String> ids = list.stream().map(r -> r.getField1Field2Concatenated()).collect(Collectors.toList());

您可以连接两个字段并进行搜索。

Select e from Entity e where concat(e.field1,  c.field2) in (:ids)

如果任何字段不是文本,则可以强制转换

Select e from Entity e where concat(cast(c.field1 as string),  c.field2) in (:ids)
bprjcwpo

bprjcwpo3#

就像我在Discourse question中回答的那样,JPA CriteriaBuilder的Hibernate扩展是HibernateCriteriaBuilder,它为您提供了一个或多或少稳定的API。我可能错了,但我认为元组比较还不够稳定,这就是为什么这个特性只定义在NodeBuilder上,它是根据孵化中的SQM API定义的。您可以使用NodeBuilder.tuple(null, root.get("attr1"), root.get("attr2")).in(subquery)按照JPA Criteria API对相同的东西进行建模。

相关问题