【问题标题】:How to use AND SqlRestriction which contains OR condition inside?如何使用里面包含 OR 条件的 AND SqlRestriction?
【发布时间】:2016-02-12 11:16:58
【问题描述】:

我在使用限制时遇到了问题。我有一张表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 来解决它?还是我错过了其他东西?

【问题讨论】:

标签: java hibernate


【解决方案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();

【讨论】:

  • 感谢您的快速答复。我正在使用Restrictions.conjunction 进行测试,这也给出了预期的结果。这两者有什么区别吗?
  • @blackSmith Restrictions.conjunction 返回在某种意义上应该被视为由 AND 连接的标准列表,允许您拥有两个以上。并不是说你不能对 Restrictions.and 做同样的事情,而是你必须调用它 n - 1 次,其中 n 是条件数。总而言之,不,它的工作方式相同。如果你有很多条件用 AND 或 OR(析取)连接,它只会让写出来更方便。
猜你喜欢
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 2017-04-02
  • 2016-12-26
  • 2019-02-16
  • 2022-10-12
相关资源
最近更新 更多