当前位置: 首页 > 知识库问答 >
问题:

条件Api Vs QueryDsl Vs JPA元模型

邓建柏
2023-03-14
    null

根据我所读到的内容,使用QueryDsl或JPA元模型的主要优点之一是类型安全。
但即使使用标准API也可以实现类型安全。(我将JPA与eclipselink一起使用)

javax.persistence.entityManager有两个变体

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

我同意第一个版本,在这个版本中,我将sql作为字符串传递,但没有获得类型安全。但是在第二个版本中,我得到了类型安全。还是我漏了什么?谁能用一个例子来解释使用条件是不安全的。

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

共有1个答案

龙逸清
2023-03-14

您提供的语法是JPQL,而不是标准API。JPQL有查询类型@query、@TypedQuery、@NamedQuery,它们是用易于出错的纯JPQL编写的。我们还有@nativequery,如果可能的话,应该避免使用。
还有其他更安全的选项,如标准Api或QueryDSL仅用于查询。

条件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,它比标准API更直观(IMHO)。

QEmployee employee = QEmployee.employee;
query.from(employee).where(employee.dept.eq("Admin"))
 类似资料:
  • 问题内容: 在下面的cellTemplate中显示数据时如何添加条件: 预期结果应为行状态显示。 这是the 子 提前致谢。 问题答案: 您必须使用。 在您的标记中,定义网格持有人,如下所示。 并在您的控制器中使用以下代码: 或使用角度滤镜。 请注意,这仅 呈现 文本。最好的方法是在ui-grid中使用它之前先转换为具有真实文本状态。以防万一您以后要进行一些基于文本的过滤。 这是一个柱塞

  • 我正在尝试根据一些编译时条件,有条件地向元组模板类型添加类型,如下所示: 我知道这不是有效的代码,但从概念上讲,我试图有条件地向元组列表中添加类型。我希望在条件解析为时跳过该类型。 有办法做这样的事情吗?

  • 英文原文:http://emberjs.com/guides/templates/conditionals/ 有些时候,或许我们只希望在一个属性存在的时候显示一部分模板。 这时,我们就可以使用{{#if}}助手按条件渲染一个代码块,如下所示: 1 2 3 {{#if person}} Welcome back, <b>{{person.firstName}} {{person.lastNam

  • 问题内容: 我有一个包含一组其他实体的实体。 Entity1包含SetEntityTwos 我想为entityTwos内部的“ id”字段创建搜索条件。 我搜索了,但没有得到任何答案。有人有主意吗? 谢谢,斯里 问题答案: 很容易。就像是:

  • 问题内容: 我的系统将配置数组发送给类似这样的函数: 我想根据某些情况创建一个键值对。 我可以在不为数组创建变量的情况下做到这一点(并且这会破坏其他人创建的干净配置语法)吗? 像这样 以上显然在语法上是错误的,但应该表达我的想法。 谢谢 问题答案: 最终我想到了以下几点: callThatFunction(array(k1 => v1,k2 => v2,… kn = vn) +($ cond?ar

  • 三元运算符 三元运算符 ? 应该只用在它能让代码更加清楚的地方。 一个条件语句的所有的变量应该是已经被求值了的。类似 if 语句,计算多个条件子句通常会让语句更加难以理解。或者可以把它们重构到实例变量里面。 推荐: result = a > b ? x : y; 不推荐: result = a > b ? x = c > d ? c : d : y; 当三元运算符的第二个参数(if 分支)返回和条