原生SQL查询转换为HQL查询咨询,附订单表筛选条件与示例
Order表多条件查询HQL实现方案
假设你的Hibernate实体类命名为Order,类属性和表字段映射为驼峰格式(OrderId对应orderId、UserId对应userId、status对应status、orderDate对应orderDate),可直接使用如下简洁HQL语句:
SELECT o FROM Order o WHERE o.status = 'In-Progress' AND o.userId NOT IN ( SELECT DISTINCT userId FROM Order WHERE status = 'Validating' ) AND o.orderDate = ( SELECT MIN(orderDate) FROM Order WHERE userId = o.userId )
逻辑说明
o.status = 'In-Progress'直接筛选所有状态为进行中的订单,匹配第一个要求NOT IN子查询过滤掉所有名下存在Validating状态订单的用户,匹配第二个要求- 关联子查询取当前用户的最早下单日期,匹配后即可得到该用户最早的符合要求的订单,匹配第三个要求
注意:如果你的
orderDate字段在实体类中是字符串类型,需要确保日期格式是可正确排序的,否则MIN函数返回的结果可能不符合预期,建议使用日期类型存储该字段。
如果需要和你提供的原生SQL逻辑完全对齐的JOIN写法,也可以使用如下版本:
SELECT t1 FROM Order t1, (SELECT userId as uid, MIN(orderDate) as minDate FROM Order GROUP BY userId) t2 WHERE t1.userId = t2.uid AND t1.orderDate = t2.minDate AND t1.userId NOT IN (SELECT userId FROM Order WHERE status = 'Validating') AND t1.status = 'In-Progress'
内容的提问来源于stack exchange,提问作者utpal sharma
相关产品推荐
相关产品推荐

