【发布时间】:2016-03-19 01:00:51
【问题描述】:
我想执行一个匹配特定子类属性的查询,所以我尝试使用treat()。
在这个例子中我想要:
名称以“a”开头的所有主题,
或所有姓氏以“a”开头的人
private List<Subject> q1()
{
CriteriaBuilder b = em.getCriteriaBuilder();
CriteriaQuery<Subject> q = b.createQuery(Subject.class);
Root<Subject> r = q.from(Subject.class);
q.select(r);
q.distinct(true);
q.where(
b.or(
b.like(r.get(Subject_.name), "a%"),
b.like(b.treat(r, Person.class).get(Person_.lastName), "a%")));
return em.createQuery(q).getResultList();
}
很明显,Person 扩展了Subject,Subject 是抽象的,继承是SINGLE_TABLE,并且(非影响)。 p>
Subject 有@DiscriminatorOptions(force = true) 因为其他原因
但是生成的SQL是这样的:
select distinct subject0_.ID as ID2_71_, subject0_.CODE as CODE3_71_, ...
from SUBJECT subject0_
where subject0_.DTYPE='Person' and (subject0_.name like 'a%' or subject0_.lastName like 'a%')
在我期待的时候:
select distinct subject0_.ID as ID2_71_, subject0_.CODE as CODE3_71_, ...
from SUBJECT subject0_
where subject0_.name like 'a%' or (subject0_.DTYPE='Person' and subject0_.lastName like 'a%')
有没有办法使用标准生成器生成预期的查询?
注意
- 使用另一个 Root -
q.from(Person.class) - 使用子查询 -
q.subquery(Person.class) - 将 lastName 字段移至 Subject
- 使用原生查询
- 使用实体图
不可接受。
我对可以在 WHERE 子句中直接声明和使用的东西感兴趣(仅由 CriteriaBuilder 和/或单个 Root ,就像treat() 子句一样),如果它确实存在的话。
【问题讨论】:
标签: hibernate jpa inheritance criteria criteria-api