如何使用Hibernate Criteria在单个查询中访问多个表?

时间:2014-07-11 11:54:01

标签: java hibernate criteria

我有两个表要查询,到目前为止我已经提出了以下HQL查询:

From DriverEntity d 
where exists (
    From LicenceEntity l 
    where driverId = d.Id 
        and l.licenceType.id = '3'
        and l.validFrom > TO_DATE('2014-01-01', 'YYYY-MM-DD')
        and l.validFrom < TO_DATE('2014-04-17', 'YYYY-MM-DD')
        and l.validTo > TO_DATE('2014-07-02', 'YYYY-MM-DD')
        and l.validTo < TO_DATE('2095-07-12', 'YYYY-MM-DD')))
我正在查询两张桌子;一个有许可证,一个有驱动程序。每个驱动程序都可以拥有许多许可证。

查询效果很好,但我希望使用Criteria,以便在添加更多搜索选项时更轻松地进行编辑。

使用Criteria,这个查询会是什么样子?我已经查看了DetachedCriteria,但我完全不了解它。

3 个答案:

答案 0 :(得分:0)

您可以使用Restrictions

criteria.add(Restrictions.between("dateField", fromDate, toDate));

查询:

criteria.add(Restrictions.between("validFrom", vFd1, vFd2));
criteria.add(Restrictions.between("validTo", vTd1, vTd2));

哪里

vFd1,2和vTd1,2将是java日历日期,时间设置为零。

参考:

https://stackoverflow.com/a/10074111/3603806

答案 1 :(得分:0)

您可以在DetachedCriteria的帮助下添加子查询:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Criteria criteria = Criteria.forClass(DriverEntity.class,"driver");
DetachedCriteria dc = DetachedCriteria.forClass(LicenceEntity.class,"licence");
dc.add(Property.forName("driver.id").eqProperty("licence.driverId"));
dc.add(Restrictions.between("validFrom", df.parse("2014-01-01"), df.parse("2014-04-17")));
dc.add(Restrictions.between("validTo", df.parse("2014-07-02"), df.parse("2095-07-12")));

criteria.add(Subqueries.exists(dc.setProjection(Projections.id())));

答案 2 :(得分:0)

根据Hibernate Developer Guide,开发人员应该使用CriteriaQuery而不是Criteria。

请看这个示例,它解释了如何创建multiple roots query or joins