【发布时间】:2018-05-29 13:09:57
【问题描述】:
我正在尝试将以下简单查询转换为 JPA 标准 API:
SELECT ticket_action.ticket_id IS NOT NULL, ticket.id
FROM ticket
LEFT OUTER JOIN ticket_action ON ticket.id = ticket_action.ticket_id
我尝试了两种方法:
- 使用
criteriaBuilder.function("ISNULL", Boolean.class, ticketAction.get(TicketAction_.ticketId)):问题是如果ISNULL与ISNOTNULL类似(对于MySQL/MariaDB 数据库),则没有否定性 - 使用
criteriaBuilder.isNotNull(ticketAction.get(TicketAction_.ticketId)):但这会返回Predicate,而select语句只接受Expressions
拉伸目标:同GROUP BY ticket.ticket_id IS NOT NULL
请求的表结构
+-----------+---------+
| ticket |
+-----------+---------+
| name | type |
+-----------+---------+
| id | integer |
| title | varchar |
+-----------+---------+
+-----------+---------+
| ticket_action |
+-----------+---------+
| name | type |
+-----------+---------+
| id | integer |
| ticket_id | integer |
| title | varchar |
+-----------+---------+
结果:
最后,我最终使用了一个构造函数查询,它接收到 ticket_action 的 id 等。在构造函数中有关于状态的决定:this.hasTicketAction = ticketActionId != null;
不是很满意,但工作正常。
感谢您发布您的答案!
【问题讨论】:
-
是否可以查看您的实体?
@OneToOne?还有 3-4 行你期望的结果是什么?是不是像true, 1: false, 2; false,3, true:4 -
对于延伸目标的
GROUP BY:有一个聚合或分组什么? -
更新了我的答案。你能检查一下这个
GROUP BY ticket.ticket_id IS NOT NULL吗? -
您的第二种方法描述是错误的。
isNotNull返回一个Predicate<Boolean>,它确实是一个Expression<Boolean>,并且还扩展了Selection<Boolean>。问题是 Boolean 泛型类型与 CriteriaQuery 泛型类型定义的任何内容发生冲突。也许如果您发布了查询结构的其余部分,那么它将是一个更完整的定义......
标签: java jpa criteria-api