gpt4 book ai didi

java - 标准 Api 与 QueryDsl 与 JPA 元模型

转载 作者:搜寻专家 更新时间:2023-11-01 02:57:08 24 4
gpt4 key购买 nike

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

  • 标准 API
  • 查询 Dsl
  • Jpa 2.0 元模型

据我所知,使用 QueryDsl 或 JPA 元模型的主要好处之一是类型安全。
但即使使用 Criteria API,我也可以实现类型安全。 (我将 JPA 与 eclipselink 一起使用)

javax.persistence.EntityManager 有两个变体

public Query createQuery(String sqlString);   
public <T> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery);

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

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

最佳答案

JPA 提供了三种基本类型的查询

  1. 查询 用 JPQL 编写。它有 TypedQueryNamedQuery 的子类型。
  2. NativeQuery 以纯 SQL 编写。
  3. Criteria API 查询以编程方式构建。可以使用Jpa元模型来指定属性,使其更加安全。

这些方法中的每一种都有其自身的优点/缺点,因此您将根据自己的需要选择一种。

QueryDSL 是一个比 JPA 的 Criteria API 更简单直观(恕我直言)的库。


问题中使用的示例是 TypedQuery。它只是 Query 的子类型,它定义了事先已知的返回类型,并消除了可能的类型转换异常。它只是关于返回类型查询 本身仍然是使用纯 JPQL 字符串构建的,因此它不是类型安全的查询。另一方面,Criteria API 是类型安全的。我们以编程方式构建查询,并且我们知道实体属性的类型。



具有部门关系的经典员工实体的

示例

Criteria Api 可与基于字符串的属性一起使用。您可能会输入错误的“部门”并收到错误消息。

Root<Employee> employee = query.from(Employee.class);
query.select(employee).where(cb.equal(employee.get("dept"), "HR"));

或者我们可以使用 Jpa 元模型 生成的元模型类来引用属性。您不能输入错误的 dept,因为您只能使用 Employee 的现有属性名称。

Root<Employee> employee = query.from(Employee.class);
query.select(employee).where(cb.equal(employee.get(Employee_.dept), "HR"));

或者我们可以使用QueryDSL:

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

关于java - 标准 Api 与 QueryDsl 与 JPA 元模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53325506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com