【问题标题】:In Hibernate 5, what's the CriteriaQuery equivalent of Criteria's restriction and projection?在 Hibernate 5 中,CriteriaQuery 相当于 Criteria 的限制和投影?
【发布时间】:2018-04-30 06:22:48
【问题描述】:

在Hibernate 5之前弃用了条件类,您可以将限制添加到标准中,以充当约束,并作为SELECT语句充当的预测,如

Criteria criteria = session.createCriteria(T.class)
    .add(Restrictions.or(Restrictions.eq(property, constraintValue)
    .set(Projection(Projections.projectionList()
    .add(Projections.property(selectValue)));

但是,既然您现在需要像这样使用 CriteriaQuery,

 CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
 CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(T.class);
 Root<T> root = criteriaQuery.from(T.class);
 criteriaQuery.select(root);

 Query<T> query = session.createQuery(criteriaQuery);

但是我一直无法弄清楚如何在 SQL 语句中添加某些需要的东西,主要是因为由于命名相似,搜索文档往往会找到有关 Criteria 的文档。

那么,如何使用 CriteriaQuery 重新创建一个简单的查询,如下所示?

SELECT selectValue  
FROM tables.T  
WHERE property = constraintValue

【问题讨论】:

    标签: java hibernate hibernate-criteria


    【解决方案1】:

    Source.

    有多个示例,但事实证明我们试图重新创建的简单选择语句可以这样完成:

    CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
    CriteriaQuery<SELECTVALUETYPE> criteriaQuery = criteriaBuilder.createQuery(SELECTVALUETYPE.class);
    Root<PARENTCLASS> root = criteriaQuery.from(PARENTCLASS.class);
    criteriaQuery.select(root);
    criteriaQuery.where(criteriaBuilder.equal(root.get(property), constraintValue));
    
    Query<SELECTVALUETYPE> query = session.createQuery(criteriaQuery);
    

    请注意,这是一个通用答案,实际上不会运行。原因是 SELECTVALUETYPE 需要替换为 selectValue 的数据类型。
    例如,CriteriaQuery 可能变为:

    • 字符串选择值 -> CriteriaQuery
    • T selectValue -> CriteriaQuery

    因此,该语句的工作示例

    Select name  
    From Users  
    Where ID = 1
    

    可以用下面的块表示

    int ID = 1;
    CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
    CriteriaQuery<String> criteriaQuery = criteriaBuilder.createQuery(String.class);
    Root<User> root = criteriaQuery.from(User.class);
    criteriaQuery.select(root.get("name");
    criteriaQuery.where(criteriaBuilder.equal(root.get("ID"), ID));
    
    Query<String> query = session.createQuery(criteriaQuery);
    
    List<String>results = query.getResultList();
    for(String name : results){
        System.out.println("Name: " + name);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-20
      • 1970-01-01
      • 2013-02-04
      • 2019-07-09
      • 1970-01-01
      • 2021-02-03
      相关资源
      最近更新 更多