java - 如何使用 JPA CriteriaBuilder 在 WHERE 中使用多个值

标签 java sql jpa criteria criteria-api

我有一个包含 3 列的示例 MyTable - id、common_id、creation_date,其中 common_id 对条目进行分组。

现在我想使用 CriteriaBuilder 从每个组中选择所有最新条目(即为每个 common_id 获取最新的创建日期)。

在 SQL 中,查询如下所示:

select * from MyTable where (common_id, creation_date) in (select common_id, max(creation_date) from MyTable group by common_id)

现在我尝试通过编写类似的内容来创建 where 谓词(cb 是 CriteriaBuilder,root 是 Root):

cb.array(root.get('common_id'), cb.max(root.get('creation_date')))
                                .in(
                                    query.subquery(MyTable.class)
                                            .select(cb.array(root.get('common_id'), cb.max(root.get('creation_date'))))
                                            .groupBy(root.get('common_id')))

但不幸的是 cb.array 不是一个表达式(它是一个CompoundSelect),所以我不能在它上面使用 .in() 。

谢谢指点!

最佳答案

您可以使用 JPQL 创建它吗?据我所知,这是不可能的。

我查看了 Spect(4.6.16 子查询),它讨论了“简单的选择表达式”:

simple_select_clause ::= SELECT [DISTINCT] simple_select_expression

我相信只有一种返回是可能的,如果您查看那里的示例,您将找不到类似的东西。

您将需要使用 NativeQuery。

关于java - 如何使用 JPA CriteriaBuilder 在 WHERE 中使用多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26980437/

相关文章:

java - @BeforeClass 在 eclipse 中为同一个类运行多次

预定义值的 SQL 结果表

JPA 实体管理器 : Why use persist() over merge()?

java - 如何在 JPA 中持久保存 List<Object> 类型的属性?

mysql - 如何提高此 SELECT 查询 JOIN 的性能

spring - Spring测试的 Autowiring 问题

java - 在数据库中存储 joda-time 日期时间

java - 让 JSON 字符串跨越多个 Socket receive()

java - 元数据提取 - Java

sql - 一次在两个表中插入相关记录?