Java 在现实世界中,JPA2标准API更可取的例子有哪些?

Java 在现实世界中,JPA2标准API更可取的例子有哪些?,java,hibernate,jpa,jpa-2.0,Java,Hibernate,Jpa,Jpa 2.0,我已经看过JPA2.0标准API,但我发现它与Hibernate标准相比过于繁琐。使用JPA2.0标准API而不是使用JPA-QL有什么好的理由吗?感谢您的建议。JPA 2.0 Criteria API是用于构建查询的基于对象的API。我认为当您有一个动态查询时,它可以起到很好的作用,该查询可以变得更具可读性,如下所示 cq.select(...) .where(...) .orderBy(...) .groupBy(...); br com ar

我已经看过JPA2.0标准API,但我发现它与Hibernate标准相比过于繁琐。使用JPA2.0标准API而不是使用JPA-QL有什么好的理由吗?感谢您的建议。

JPA 2.0 Criteria API是用于构建查询的基于对象的API。我认为当您有一个动态查询时,它可以起到很好的作用,该查询可以变得更具可读性,如下所示

cq.select(...)
  .where(...)
  .orderBy(...)
  .groupBy(...);
br
   com
       ar
           moduleA
               model
                   repository
                       moduleA.xml
           moduleB
               model
                   repository
                       moduleB.xml               
           moduleC
               model
                   repository
                       moduleC.xml
但是当使用静态查询时更喜欢使用外部化、可维护和可读的文件

然后定义mappinf文件元素

<mapping-file>br/com/ar/moduleA/model/repository/moduleA.xml</mapping-file>
<mapping-file>br/com/ar/moduleB/model/repository/moduleB.xml</mapping-file>
<mapping-file>br/com/ar/moduleC/model/repository/moduleC.xml</mapping-file>
br/com/ar/moduleA/model/repository/moduleA.xml
br/com/ar/moduleB/model/repository/moduleB.xml
br/com/ar/moduleC/model/repository/moduleC.xml

与Hibernate Criteria API一样,JPA 2.0 Criteria API特别适合动态构建查询,以处理查询结构因运行时条件而异的情况

但还有更多。虽然JPA Criteria API比Hibernate的Criteria API更详细,但它允许构建typesafe查询(如果您使用元模型API)。下面是一个例子:

EntityManager em = ...
QueryBuilder qb = em.getQueryBuilder();
CriteriaQuery<Person> c = qb.createQuery(Person.class);
Root<Person> p = c.from(Person.class);
Predicate condition = qb.gt(p.get(Person_.age), 20);
c.where(condition);
TypedQuery<Person> q = em.createQuery(c); 
List<Person> result = q.getResultList();
如果您想知道,
Person
是与原始
Person
实体类(由注释处理器生成)相对应的静态、实例化、规范的元模型类。它提供了基于运行时反射方法的强类型替代方法:

Field field = Person.class.getField("age");
优点:

  • 类型安全,编译时验证!
    • 禁止构造语法不正确的查询
    • 重构后可能引发编译错误
    • 为自动完成提供现成的支持
  • 更适合动态查询
缺点:

  • 更详细
  • 可读性较差
一般来说,我觉得使用JPQL更舒服,但是CriteriaAPI的类型安全性与JPQL(以及Hibernate CriteriaAPI)有一个主要区别

另见
相关答案

如果生成实体元模型,JPA 2标准可以以静态类型的形式使用。它比JPQL更详细,但是是静态类型的,并且直接支持动态查询构造


静态类型查询语言的好处是,您可以在编译时捕获更多错误,并且还可以使用诸如autocomplete之类的IDE功能。

对于我来说,JPA2的真实示例是当您需要根据用户输入创建查询时。我不是说一个非常简单的,只有一个参数的where。我的意思是当你在应用程序中做了一个高级搜索选项时。当某个参数被填充时需要连接的参数。您不知道如何连接HQL或SQL以包含大量参数、额外连接和函数。定制SQL需要大量的测试来证明它是有效的。向HQL和SQL添加额外的搜索选项需要大量返工,而在JPA中这可能更简单。

Nice。我认为这更像Rails3.0中的Arel。谢谢分享。这个问题本质上是重复的,因为正反两方面是一样的。不是真的。JPA2.0标准API不像Hibernate标准那么简单。我以前使用过Hibernate标准,我觉得JPA2.0标准API有点麻烦。实际上,我省略了一个非常重要的区别,我将在回答中介绍。感谢Pascal的解释。我有一个问题,为什么在代码中没有使用我在其他示例中找到的核心:Metamodel m=em.getMetamodel();EntityType Pet=m.entity(Pet.class);
Predicate condition = qb.gt(p.get(Person_.age, "xyz"));
Field field = Person.class.getField("age");