如何使用包含OR条件的AND SqlRestriction?

时间:2016-02-12 11:16:58

标签: java hibernate

我在使用限制时遇到问题。我有一张表employee,其结构如下:

id : int (primary key)
create_date : datetime
modified_date: datetime

我正在使用以下代码列出员工是否在特定时间间隔内创建/修改:

Criteria criteria = getSession().createCriteria(Employee.class);

criteria.add(Restrictions.eq("id", employeeId));

if (interval > 0) {
     String sql = "{alias}.create_date > DATE_SUB(NOW(), INTERVAL " + interval + " SECOND) OR {alias}.modified_date > DATE_SUB(NOW(), INTERVAL " + interval + " SECOND)";
     criteria.add(Restrictions.sqlRestriction(sqlWhere));
}

List<Employee> employeeList = criteria.list();

请注意,SqlRestriction内部存在OR条件。

现在假设employeeId = 10interval = 3600employeeList包含其他员工以及id = 10,这不应该发生。

我应该使用Restrictions.and还是Restrictions.conjunction来解决它?或者我错过了别的什么?

1 个答案:

答案 0 :(得分:1)

这里没有魔力。使用Restrictions.and方法对两个条件进行分组。 Hibernate应该自动对子查询进行分组以获得所需的结果。

Criteria criteria = getSession().createCriteria(Employee.class);

Criterion whereClause = Restrictions.eq("id", employeeId);
if (interval > 0) {
    String sql = "{alias}.create_date > DATE_SUB(NOW(), INTERVAL " + interval + " SECOND) OR {alias}.modified_date > DATE_SUB(NOW(), INTERVAL " + interval + " SECOND)";
    Criterion andConjunction = Restrictions.and(
        whereClause, 
        Restrictions.sqlRestriction(sqlWhere)
    );

    whereClause = andConjunction;
}
criteria.add(whereClause);

List<Employee> employeeList = criteria.list();