条件Api与QueryDsl与JPA元模型

pvp*_*ran 5 java criteria type-safety querydsl jpa-2.0

我对这三个概念感到困惑。

  • 标准API
  • 查询Dsl
  • 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静态元模型有什么区别?

Erl*_*lan 6

您提供的语法是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)


小智 5

您可以在 Criteria API 中使用 JPA 元模型来确保类型安全,但与 QueryDSL 相比,criteria api 相当复杂