一尘不染

JPA条件查询,订购课程

hibernate

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


阅读 308

收藏
2020-06-20

共1个答案

一尘不染

JPA 2.0引入了一个新TYPE表达式,该表达式允许查询根据类类型限制结果。

您可以使用通过Criteria API使用类型表达式Path#type()。因此,您可以 尝试

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节“实体类型表达式”

更多资源

2020-06-20