假设我有:
abstract class Shape { boolean visible; }
class Circle extends Shape { int radius; }
class Square extends Shape { int side; }
假设我想要所有形状为visible=true
的形状,加上所有带有radius=10
的圆形,加上所有带side=15
的方形。
我不能这样做:
List results = session.createCriteria(A.class)
.add(Restrictions.disjunction()
.add(Restrictions.eq("visible", true))
.add(Restrictions.eq("radius", 10))
.add(Restrictions.eq("side", 15))).list();
因为radius
和side
不是Shape
字段:
Caused by: org.hibernate.QueryException: could not resolve property: radius of: Shape
我的问题是:如何在单个查询中解决此问题,最好不使用HQL?
另外: Shape InheritanceType
(TABLE_PER_CLASS
,JOINED
或SINGLE_TABLE
)会对此问题产生任何影响吗?
答案 0 :(得分:0)
我建议使用InheritanceType.JOINED
,因为它可以很好地建模您的数据(在数据库和对象方面(例如Square在数据库或对象模型中没有半径),同时允许您要执行多态查询(在这种情况下,在所有形状上搜索visible
)。
由于您需要执行子选择,因此JOINED
样式的查询会变得有点困难。老实说,这并不困难:
List results = session.createCriteria(Shape.class)
.add(Restrictions.disjunction()
.add(Restrictions.eq("visible", true))
.add(Subqueries.propertyIn("id",
DetachedCriteria.forClass(Circle.class)
.add(Restrictions.eq("radius", 10))
.setProjection(Projections.groupProperty("id")))
.add(Subqueries.propertyIn("id",
DetachedCriteria.forClass(Square.class)
.add(Restrictions.eq("side", 15))
.setProjection(Projections.groupProperty("id")))))
).list();