Hibernate / HQL实现SQL WHERE ... IN(SELECT ...)查询

时间:2012-12-19 22:53:19

标签: hibernate subquery hibernate-criteria where-in

使用Hibernate实现相当于涉及子查询的以下SQL查询的最佳方法是什么:

SELECT cat.description, cat.code FROM
  THING_CATEGORY cat
WHERE cat.code IN (
  SELECT thing.CATEGORY_CODE FROM THING thing
  WHERE thing.COUNTRY_CODE IN ('AU', 'US', 'UK')
)

最好的方法是将其直接传递给数据库,以便在我的数据库SQL(PL / SQL)中本地完成,但我实际上无法弄清楚它是如何在Hibernate中完成的{ {1}}对象,所以我特别想知道。

请注意:Criterion表格非常庞大且有很多列,因此我不想从数据库中删除所有THING实体以实现此逻辑,因为它不具备高性能。限制THING结果的逻辑必须在可以优化的数据库中完成。实际上,当我使用原始PL / SQL进行查询时,几乎需要一秒钟才能得到结果。

了解实体(请注意THING_CATEGORY没有引用回THING_CATEGORY):

THING

1 个答案:

答案 0 :(得分:0)

当我即将发布问题时,我意识到答案是使用Hibernate DetachedCriteria来包含THING限制子查询。然后将其添加到THING_CATEGORY主查询的条件中。

所以Hibernate代码看起来像这样:

public List<ThingCategory> getRestrictedByCountrySet(List<String> countryCodes)
{
  Criterion thingCriterion = Restrictions.in("countryCode", countryCodes);
  DetachedCriteria thingSubQuery = DetachedCriteria.forClass(Thing.class)
    .add(thingCriterion)
    .setProjection(Projections.property("categoryCode");

  Criteria thingCategoryCriteria = getHbSession().createCriteria(ThingCategory.class)
    .add(Property.forName("code").in(thingSubQuery));

  return thingCategoryCriteria.list();
}