我对这三个概念有些困惑。
根据我的阅读,使用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静态元模型之间有什么区别?
答案 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"))