Java Persistence API 中带注释的命名查询是否真的非常有用?
2009-10-23 00:00:00 来源:WEB开发网下面是如何定义命名查询,并将其与实体类关联的一个示例:
@Entity
@Table(name="ORDER")
@NamedQuery(
name="getAllOrder",
queryString="SELECT OBJECT(o) FROM CustomerOrder as o WHERE
o.customerId = :customerId")
public class CustomerOrder implements Serializable {
使用带注释的命名查询所带来的问题
稍等片刻! 我刚才不是说过吗?命名查询是外部化查询的好方法。尽管将命名查询定义为注释可以使查询在代码中得到更多重用,但是优点很少,在本质上没有使用价值。我可以方便地将命名查询打包在一个方法中,并重复执行它。其主要优点是查询的外部化,因此,带注释的命名查询(如果有)几乎没有任何意义。
还可以使用 XML 元数据定义 NamedQuery:
<named-query name="getAllOrders" queryString="SELECT OBJECT(o)
FROM CustomerOrder as o WHERE o.customerId = :customerId" />
现在,我可以方便地对命名查询进行更改,而无需更改源代码和重新编译。回忆我使用 CMP 的时候,查询位于 XML 部署描述符中的这一事实致使此因素无任何意义。所有查询都定义在单个 ejb-jar.xml 文件中,打包在 EJB JAR中,并进一步打包在 EAR 中。在 XML 文件中更改 JPA-QL 的工作量仍很大。(Martin Fowler 也说明了这一点。)
虽然可以采用备用描述符思想,但是单一元数据使它成为一个不引人注意的选择。
JPA 有三个重要的不同之处:
只要映射文件在类路径中存在,那么它们就可以打包在任何 JAR 中(甚至松散打包)。
Tags:Java Persistence API
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接