在 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)));
Run Code Online (Sandbox Code Playgroud)
但是,由于您现在需要像这样使用 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);
Run Code Online (Sandbox Code Playgroud)
然而,我一直无法弄清楚如何添加 SQL 语句中所需的某些内容,主要是因为由于命名相似性,搜索文档往往会找到有关 Criteria 的文档。
那么,如何使用 CriteriaQuery 重新创建一个简单的查询(如下所示)?
SELECT selectValue
FROM tables.T
WHERE property = constraintValue
Run Code Online (Sandbox Code Playgroud) 阅读了Hibernate的理论后,我多次遇到这样的想法,在理想的世界中,你不应该将Hibernate与原始的SQL查询混合在一起,原因有多种,比如Hibernate无法识别以这种方式执行的更改在正确冲洗方面有影响.
我的任务是尝试优化和改进与数据库通信的几个类,但不经过Hibernate就这样做.他们直接使用JdbcTemplate来运行查询,我注意到这对更新语句更常见.
这是故意和良好的设计,由于某些原因,例如只更新选定数量的字段并且数据库中的对象非常大,或者我是否应该重构这些类以便它们利用DAO层类来执行这些更新疑问?