条件Api与QueryDsl与JPA元模型

时间:2018-11-15 18:08:58

标签: java jpa-2.0 criteria querydsl type-safety

我对这三个概念有些困惑。

  • 标准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); 

我同意第一个版本,在该版本中我将sql作为字符串传递,但我没有类型安全性。但是有了第二个版本,我得到了类型安全性。还是我在这里想念什么?有人可以举例说明使用条件不安全吗。

QueryDsl和JPA静态元模型之间有什么区别?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

或者我们可以使用 Jpa元模型

生成的元模型类来引用属性
Root<Employee> employee = query.from(Employee.class);
query.select(employee)
     .where(cb.equal(employee.get(Employee_.dept), "Admin"));


还有 QueryDSL ,它是Criteria API的更直观的替代(IMHO)。

QEmployee employee = QEmployee.employee;
query.from(employee).where(employee.dept.eq("Admin"))