[hibernate-dev] TREAT operator and joined inheritance (HHH-9862)
Gail Badner
gbadner at redhat.com
Mon Jun 15 16:26:56 EDT 2015
JPA 2.1 shows examples of using multiple downcasts in a restriction:
4.4.9 Downcasting
SELECT e FROM Employee e
WHERE TREAT(e AS Exempt).vacationDays > 10
OR TREAT(e AS Contractor).hours > 100
6.5.7 Downcasting
Example 3:
CriteriaQuery<Employee> q = cb.createQuery(Employee.class);
Root<Employee> e = q.from(Employee.class);
q.where(
cb.or(cb.gt(cb.treat(e, Exempt.class).get(Exempt_.vacationDays),
10),
cb.gt(cb.treat(e, Contractor.class).get(Contractor_.hours),
100)));
These don't work in Hibernate for joined inheritance because Hibernate uses an inner join for the downcasts.
I've added a FailureExpected test case for this: https://github.com/hibernate/hibernate-orm/commit/1ec76887825bebda4c02ea2bc1590d374aa4415b
IIUC, inner join is correct when TREAT is used in a JOIN clause. If TREAT is only used for restrictions in the WHERE clause, I *think* it should be an outer join. Is that correct?
HHH-9862 also mentions that Hibernate doesn't work properly when there are multiple select expressions using different downcasts, as in:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Object[]> query = cb.createQuery(Object[].class);
Root<Pet> root = query.from(Pet.class);
query.multiselect(
root.get("id"),
root.get("name"),
cb.treat(root, Cat.class).get("felineProperty"),
cb.treat(root, Dog.class).get("canineProperty")
);
I don't think this should work, at least not with implicit joins. Is this valid?
Thanks,
Gail
More information about the hibernate-dev
mailing list