在Hibernate 5中,CriteriaQuery相当于Criteria的限制和预测是什么?

时间:2017-11-16 16:11:32

标签: java hibernate hibernate-criteria

在Hibernate 5弃用Criteria类之前,您可以向Criteria添加限制以充当约束,并将投影添加为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

1 个答案:

答案 0 :(得分:0)

Source.

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

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可能变为:

  • String selectValue - &gt; CriteriaQuery
  • T selectValue - &gt; 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);
}