Hibernate Criteria查询子类的属性

时间:2014-08-13 20:18:11

标签: sql hibernate hql criteria

假设我有:

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();

因为radiusside不是Shape字段:

Caused by: org.hibernate.QueryException: could not resolve property: radius of: Shape

我的问题是:如何在单个查询中解决此问题,最好不使用HQL?

另外: Shape InheritanceTypeTABLE_PER_CLASSJOINEDSINGLE_TABLE)会对此问题产生任何影响吗?

1 个答案:

答案 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();