快速业务通道

Java Persistence API中带注释的命名查询是否真的非常有用? - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20

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 在许多情形中都是必需的。我在以前的评论专栏中给出了许多理由。

Java Persistence API中带注释的命名查询是否真的非常有用?(2)

时间:2011-01-24 IBM Roland Barcia

命名查询

在大多数情形中,您希望定义可以重用的知名查询。命名查询使您能够在单个位置定义一个查询。命名查询有许多优点:

外部化或分离查询可以在更改查询时实现某些灵活性。这在优化查询和锁定查询时可能较为有用。

您可以从多个位置使用查询。

您可以将查询与知名的业务名称关联。

您可以将命名查询定义为注释,并在代码中的其他位置执行它。下面是执行此类命名查询的一个使用示例:

Query allOrders = em.createNamedQuery("getAllOrder"); allOrders.setParameter("customerId",customerId); Collection <CustomerOrder> results = allOrders.getResultList(); return results;

下面是如何定义命名查询,并将其与实体类关联的一个示例:

@Entity @Ta

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号