JPA条件查询,上课顺序

Jer*_*oen 8 hibernate jpa criteria-api jpa-2.0

有没有办法让JPA标准查询在课堂上订购?想象一下以下域对象:

abstract class Hobby { ... }
class Coding extends Hobby { ... }
class Gaming extends Hobby { ... }
Run Code Online (Sandbox Code Playgroud)

使用常规QL我能够做到

from Hobby h order by h.class
Run Code Online (Sandbox Code Playgroud)

但是当我在条件查询上应用相同的逻辑时,会发生运行时异常"未知属性".

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();
Run Code Online (Sandbox Code Playgroud)

使用的JPA实现:Hibernate-EntityManager v3.5.5-Final

Pas*_*ent 9

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();
Run Code Online (Sandbox Code Playgroud)

虽然这段代码编译,但我没有测试它(明天我会试一试).

实际上,我想知道这是否合法,或者它是否type()应该成为选择的一部分order by(也许这是标准查询应该生成的).需要检查一下.

参考

  • JPA 2.0规范
    • 第4.6.17.4节"实体类型表达式"

更多资源