【问题标题】:Hibernate Criteria condition A - B > C休眠标准条件 A - B > C
【发布时间】:2015-02-19 09:04:09
【问题描述】:

如何定义休眠条件生成SQL:

SELECT * FROM table WHERE columnA - columnB > anyInteger

? 我知道有:

Restrictions.sqlRestriction("column_a - column_b > "+int);

但它取决于列名,而不是类属性。有什么办法解决吗?

【问题讨论】:

    标签: java sql hibernate criteria


    【解决方案1】:

    如果您希望能够查询列名,我认为您不能避免必须用列名来表达限制,因为计算必须发生在数据库端而不是 Java 端。但是您可以做的是将附加属性映射为 formula 以将 SQL 封装在 Hibernate 映射定义中,而不必每次查询时都重复它:

    @Formula("column_a - column_b")
    private int difference;
    

    然后你会查询它

    Restrictions.gt("difference", value)
    

    【讨论】:

      【解决方案2】:

      好的,我找到了解决方案,而不是解决方法。我必须创建 Criterion 类的新实现。这是代码:

      public class DifferenceCriterion implements Criterion{
      
          private static final long serialVersionUID = -8082375591482621375L;
      
          private String firstProperty;
          private String secondProperty;
          private int value;
      
          public DifferenceCriterion(String propertyA, String propertyB, int value) {
              this.firstProperty = propertyA;
              this.secondProperty = propertyB;
              this.value = value;
          }
      
          @Override
          public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
              TypedValue tvFirst = criteriaQuery.getTypedValue(criteria, firstProperty, value);
              TypedValue tvSecond = criteriaQuery.getTypedValue(criteria, secondProperty, value);
              if(!tvFirst.equals(tvSecond)){
                  throw new HibernateException("Properties typedValues are not the same!");
              }
              return new TypedValue[] {tvFirst};
          }
      
          @Override
          public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
              final String[] columnsA = criteriaQuery.getColumnsUsingProjection(criteria, this.firstProperty);
              final String[] columnsB = criteriaQuery.getColumnsUsingProjection(criteria, this.secondProperty);
              return columnsA[0] + " - "+columnsB[0] + " >  ?";
          }
      }
      

      并输入我的条件查询方法:

      criteria.add(new DifferenceCriterion("columnA", "columnB", someInt));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-19
        • 2011-10-09
        • 2012-12-24
        • 1970-01-01
        • 2021-10-19
        相关资源
        最近更新 更多