eclipse+JBoss5+EJB3开发指南12:使用命名查询执行JPQL

在EJB3中可以使用EntityManager对象的createQuery方法来执行JPQL(类似于Hibernate中的HQL),这非常简单。但使用createQuery方法处理JPQL时,在每次执行JPQL的过程中系统都需要对JPQL进行分析,这在一定程度上降低了系统运行时的性能。为此,EJB3提供了命名查询的概念。命名查询有些类型于数据库中的存储过程,在提交的过程中就已经被编译处理了。因此,在执行效率上要高一些。
    [email protected][email protected]管理,最好放在相关的实体Bean的上方。如下面的代码所示:
package entity;
import java.util.Collection;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
@Entity
@Table(name 
="t_customers")
@NamedQuery(name
="MyQuery",query="select c from Customer c where id=:id")
publicclass Customer
{
    
privateint id;
    
private String name;
    
private Referee referee;
    
private Collection<Order> orders;
    
private Collection<Address> addresses;
    @OneToOne(cascade 
= CascadeType.ALL)
    @PrimaryKeyJoinColumn
    
public Referee getReferee()
    {
        
return referee;
    }
    
publicvoid setReferee(Referee referee)
    {
        
this.referee = referee;
    }
    @ManyToMany(cascade 
= CascadeType.PERSIST, fetch = FetchType.LAZY)
    @JoinTable(name 
="t_customers_addresses",
              joinColumns 
= @JoinColumn(name ="customer_id", referencedColumnName ="id"),
              inverseJoinColumns 
= @JoinColumn(name ="address_id", referencedColumnName ="id"))
    
public Collection<Address> getAddresses()
    {
        
return addresses;
    }
    
publicvoid setAddresses(Collection<Address> addresses)
    {
        
this.addresses = addresses;
    }
    @OneToMany(mappedBy 
="customer", cascade = CascadeType.ALL)
public Collection<Order> getOrders()
    {
        
return orders;
    }
    
publicvoid setOrders(Collection<Order> orders)
    {
        
this.orders = orders;
    }
    @Id
    @GeneratedValue(strategy 
= GenerationType.IDENTITY)
    
publicint getId()
    {
        
return id;
    }
    
publicvoid setId(int id)
    {
        
this.id = id;
    }
    
public String getName()
    {
        
return name;
    }
    
publicvoid setName(String name)
    {
        
this.name = name;
    }
}

    代码中的命名查询使用了命名参数。我们可以使用下面的代码来执行该JPQL:
private Customer queryCustomer(int id)
    {
        
return (Customer) em.createNamedQuery("MyQuery").setParameter("id", 23)
                .getSingleResult();
    }

    在Session Bean中调用queryCustomer就可以通过命名查询获得相应的Customer对象了。
《Java Web开发速学宝典》出版,欢迎定购
更多相关文章
  • 本系列教程使用的软件版本如下:Eclipse:3.4.2, Eclipse IDE for Java EE Developers JBoss :5.0.1,http://www.jboss.org/jbossas/downloads/JDK:1.6.0.14,http://java.sun.com/ ...
  • [email protected],如果是双向的一对多映射,[email protected],其他一个表t_customers在上一篇文章中已给出了,另一个表的结构如图1所示.图1  t_orders表    t_customers和t_orders表 ...
  • 如果以前使用过EJB1.x或EJB2.x的实体Bean,会发现无法通过继承实体Bean将单个表分成多表.而在EJB3中,我们很容易实现这个功能.先看看图1所示的表结构和记录.图1   t_accounts表的结构和记录package entity;import javax.persistence.C ...
  • 一.拦截器方法    EJB3可以通过拦截器对Bean方法进行拦截和覆盖.这有些象AOP中的around.通过AOP的around方法,可以修改被拦截方法的返回值.参数值,甚至可以取消被拦截方法的执行.EJB3的拦截器可以用在无状态Session Bean.有状态Session Bean和消息驱动B ...
  •  在上一篇文章中,使用单表策略将一个表从逻辑上分成了多个表.但这样可能会造成空巢字段,也就是说,一个逻辑表只由部分字段组成,而物理的表的很多字段的值就会为null.为了解决这个问题,可以将t_accounts表物理地分成多个表.为了与t_accounts表进行对比,新建一个t_myaccounts表 ...
  •  一对一映射是很常用的.在一般情况下,一个主表通过外键和从表形成一对一的关系.在EJB3[email protected]进行关联外,也可以采用共享主键的方式连接两个表.先看看如下两个表的结构:图1  t_customers图2  t_referees     t_custo ...
  •       编写有状态的(Stateful)的Session Bean也非常简单,只需要将无状态注释(@Stateless)改成有状态注释(@Stateful)即可.如果使用Stateful Sessionbean,客户端在使用同一个SessionBean对象实例时可以保存状态,也就是说,在多次引用 ...
  •   [email protected]或getter方法进行注释.先看看下面的表:图1  t_addresses表      t_addresses表和t_customers表是多对多的关系.需要使用一个关联表来描述这种关系,关联表的结构如下图所示.图2  t_cust ...
一周排行
  • [TechTarget中国原创]在Citrix XenServer里,有一个模块允许你进行P2V(physical-to-virtual,物理到虚拟)迁移.这个模块仅在受支持的操作系统下工作,目前支持Red Hat ...
  • lsnrctl start提示:The listener supports no servicesThe command completed successfully这样启动后远程连接会造成oracle ORA-12 ...
  • 软件包管理基础现在的安装步骤检查软件包的依赖关系(当检查软件包的冲突(安装前执行软件包的检查,如果执行安装前的脚本程序(建立相关目录,清理多余文件等,为安装做好准备工作)处理配置文件(它可以把原配置文件换个名字保存起 ...
  • [小蜗牛五一无聊之作]如果你每天收到很多垃圾邮件,很憎恨-你不是一个人在愤怒,你不是一个人-垃圾邮件的本质:牺牲公共利益,满足个人私利,损耗世界资源,污染世界环境.     小蜗牛不是邮件专家,只从事过相关的技术支持 ...
  • 最近发现与亲朋好友谈话交流中总是被顺口说上一句:最近胖了啊.令我很是郁闷.于是昨天开始恢复健身活动,下班回家换了运动服,赶在瑜珈课开始前5分钟走进了健身教室.等待我们的是一位来自印度的瑜珈教练,而且是一位男教练,时间 ...
  • 最近项目发布包要求用rpm制作,为了适应马上要执行的自动化部署要求.RPM build是专门为了制作rpm的工具,使用也很简单,基本上按要求写好spec,然后运行rpmbuild –bb *.spec即可制作好rpm ...
  • 美国的信息技术是很发达的,人们都知道阿波罗飞船登上月球,哥伦比亚号航天飞机在空中失事导致宇航员丧生等等航天事件,这些行驶到天空的航天器如何进行轨道确定与控制,实际上都是依靠现代的计算机系统来进行的.负责航天飞机设计. ...
  • XenDesktop7.6控制台打开慢解决方法
    问题现象安装了XenDesktop 7.x以后的版本,会发现打开XenDesktop St ...
  • 昨天弄我是小白我怕谁第一期的时候无意间发现win8的一个很明显的特征——按win键会进入一种便利模式(单击程序直接进)嗯,这个很好,很方便,但...众所周知,系统那些按键键让小黑们很头疼的呢?win键无疑前三(ctr ...
  • 我们在测试 5.6 GTID 的时候,发现了一个导致主备数据丢失的场景.特别提醒一下使用 MySQL 5.6 并启用了 GTID 的各位,以避免这种情况发生.同时也简单介绍了 GTID 的实现原理.场景描述有一台 M ...