首页 / 软件开发 / JAVA / Java Persistence API中带注释的命名查询是否真的非常有用?
Java Persistence API中带注释的命名查询是否真的非常有用?2011-01-24 IBM Roland Barcia对注释的注释Java Persistence API (JPA) 定义了访问数据的多种方法:通过实体管理器、通过 JPA-QL 或通过本机查询。在 JPA 中,注释用作将 Java 对象映射到底层数据库的一种机制。您还可以提供 XML 元数据作为映射注释的覆盖或备选机制。不过,我看到的大多数 JPA 使用情况都明显喜欢使用注释。规范文档使用注释,而不使用基于 XML 的映射示例(仅向您显示 XML 模式)来表示所有示例这一事实可能是覆盖的原因之一。创建对象关系映射,以便从 Java 对象模型抽象底层数据库的详细信息。不过,JPA 可以让数据库详细信息快速返回到 Java 源。在本文中,将检查 JPA 中的各种查询样式,解释它们存在的原因,并解释为什么对某些样式(如命名查询)进行注释没有任何意义。最后得出的结论是,这个小示例实际上是更大的问题的一部分。使用 JPA 访问数据让我们快速浏览一下使用 JPA 访问数据的各种方法,假定您非常熟悉在 JPA 中映射 Java 对象的方式。EntityManager应用程序在运行时与 Java 对象交互。通过使用称为实体管理器的特殊对象,应用程序可以查询或保持对象。EntityManager 实例与永久性上下文关联。在永久性上下文中,实体实例及其生命周期得到管理。可以认为 EntityManager 是底层永久性机制的 Facade。EntityManager 包含访问数据的必要方法。最简单的访问持久性数据的方法是使用 find 方法。下面是使用实体管理器通过主键查找对象的应用程序示例:Customer customer = (Customer)em.find(Customer.class,customerId);find 方法要求您知道主键和实际类的类型。JPA-QL 查询JPA 还拥有可以用于对象模型的全功能查询语言。JPA 查询语言包含许多用于更复杂查询的功能。可以通过动态方式将查询传递到实体管理器:Query q = em.createQuery("SELECT c FROM Customer c WHERE c.name LIKE
:custName");
q.setParameter("custName", name);
q.setMaxResults(10);
List result = q.getResultList();能够在运行时传递查询是某些动态情形(如未知条件)所必需的。不过,在大多数情形中,您希望基于整个性能测试来锁定查询。本机查询JPA 还使您能够对基础表使用本机 SQL 查询,并提供映射回结果的能力:Query q = em.createNativeQuery(
"SELECT o.id, o.quantity, o.item, i.id, i.name, i.description "+
"FROM Order o, Item i " +
"WHERE (o.quantity > 25) AND (o.item = i.id)",
"OrderItemResults");标准 SQL 在许多情形中都是必需的。我在以前的评论专栏中给出了许多理由。