JPA条件查询是否可以在课堂上订购?想象以下域对象:
abstract class Hobby { ... }
class Coding extends Hobby { ... }
class Gaming extends Hobby { ... }
使用常规QL,我能够做到
from Hobby h order by h.class
但是,当我对条件查询应用相同的逻辑时,会发生运行时异常“未知属性”。
CriteriaQuery<Hobby> criteriaQuery = builder.createQuery(Hobby.class);
Root<Hobby> hobbyRoot = criteriaQuery.from(Hobby.class);
criteriaQuery.orderBy(builder.asc(hobbyRoot.get("class"));
List<Hobby> hobbies = entityManager.createQuery(criteriaQuery).getResultList();
使用的JPA实现:Hibernate-EntityManager v3.5.5-Final
最佳答案
JPA 2.0引入了一个新的TYPE
表达式,该表达式允许查询根据类类型限制结果。
您可以使用Path#type()
在Criteria API中使用类型表达式。因此,您可以尝试:
CriteriaQuery criteriaQuery = builder.createQuery(Hobby.class);
Root hobbyRoot = criteriaQuery.from(Hobby.class);
criteriaQuery.orderBy(builder.asc(hobbyRoot.type());
List hobbies = entityManager.createQuery(criteriaQuery).getResultList();
虽然这段代码可以编译,但是我没有对其进行测试(明天我将尝试一下)。
实际上,我想知道这是否合法,或者
type()
是否应该成为select的一部分才能进行order by
(也许这就是标准查询应该生成的内容)。需要检查一下。参考资料
JPA 2.0规范
第4.6.17.4节“实体类型表达式”
更多资源
Java Persistence 2.0 Proposed Final Draft