在 Hibernate 5 中,CriteriaQuery 等同于 Criteria 的限制和投影是什么?
In Hibernate 5, what's the CriteriaQuery equivalent of Criteria's restriction and projection?
在 Hibernate 5 弃用 Criteria class 之前,您可以向 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
有多个示例,但事实证明我们尝试重新创建的简单 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 可能会变成:
- 字符串 select值 -> CriteriaQuery
- T select值 -> 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);
}
在 Hibernate 5 弃用 Criteria class 之前,您可以向 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
有多个示例,但事实证明我们尝试重新创建的简单 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 可能会变成:
- 字符串 select值 -> CriteriaQuery
- T select值 -> 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);
}