pvp*_*ran 5 java criteria type-safety querydsl jpa-2.0
我对这三个概念感到困惑。
根据我的阅读,使用QueryDsl或JPA元模型的主要好处之一是类型安全。
但是,即使使用Criteria API,我也可以实现类型安全。(我在eclipselink中使用JPA)
javax.persistence.EntityManager 有两种变体
public Query createQuery(String sqlString);
public <T> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery);
Run Code Online (Sandbox Code Playgroud)
我同意第一个版本,在该版本中我将sql作为字符串传递,但我没有类型安全性。但是有了第二个版本,我得到了类型安全性。还是我在这里想念什么?有人可以举例说明如何使用标准不安全。
QueryDsl和JPA静态元模型有什么区别?
您提供的语法是JPQL而不是 Criteria Api。JPQL 有查询类型@Query、@TypedQuery、@NamedQuery,它们是用简单的 JPQL 编写的,很容易出错。我们还有@NativeQuery,如果可能的话应该避免。
还有其他更安全的选项,如 Criteria Api 或 QueryDSL 仅用于查询。
Criteria Api可以与基于字符串的属性一起使用
CriteriaQuery<Employee> query = cb.createQuery(Employee.class);
Root<Employee> employee = query.from(Employee.class);
query.select(employee)
.where(cb.equal(employee.get("dept"), "Admin"));
Run Code Online (Sandbox Code Playgroud)
或者我们可以使用Jpa 元模型生成的元模型类来引用属性
Root<Employee> employee = query.from(Employee.class);
query.select(employee)
.where(cb.equal(employee.get(Employee_.dept), "Admin"));
Run Code Online (Sandbox Code Playgroud)
还有QueryDSL,它比 Criteria API 更直观(恕我直言)。
QEmployee employee = QEmployee.employee;
query.from(employee).where(employee.dept.eq("Admin"))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1020 次 |
| 最近记录: |