我在使用限制时遇到问题。我有一张表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 = 10
和interval = 3600
,employeeList
包含其他员工以及id = 10,这不应该发生。
我应该使用Restrictions.and
还是Restrictions.conjunction
来解决它?或者我错过了别的什么?
答案 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();