EJB3.0笔记-9实体查询与EJB QL

在java persistence中,可以同时使用EJB QL查询语言和原生的SQL来完成查询操作。由于EJB QL是一种描述Java对象的查询语言,而entity manager会为你处理由EJB QL向原生SQL转换的工作,因此它具有跨数据库厂商实现的移植能力。EJB QL比SQL更加紧凑和更容易阅读,但是EJB QL不可能都支持数据库所有私有特性,所以功能上没有厂商原生SQL那么功能全面。

Query API
    通过javax.persistence.Query接口来实现查询功能,而Query接口可以通过javax.persistence. EntityManager得到。
   
 参数
    EJB QL支持具名参数(named parameters)和指示参数(positional parameters),如:
    Query query=entityManager.createQuery(“from Customer c where c.firstName=:first and
         c.lastName=:last”);
    query.setParameter(“first”,first);
    query.setParameter(“last”,last);
    return query.getResultList();
    或者
    Query query=entityManager.createQuery(“from Customer c where c.firstName=?1 and
         c.lastName=?2”);
    query.setParameter(1,first);
    query.setParameter(2,last);
    return query.getResultList();

日期型参数
    如果要将java.util.Date或java.util.Calendar参数传入查询中,就得使用特殊的setParameter方法,    如下:
    setParameter(String name,java.util.Date value,TemporalType temporalType);
    setParameter(String name,Calendar value,TemporalType temporalType);
    其中temporalType表示将Date或Calendar参数转换成原生SQL类型时,使用的是何种数据库类型

对结果分页
    Query query=entityManager.createQuery(“from Customer c”);
    return query.setMaxResults(max).setFirstResult(index).getResultList();

Hints
    有些java.persistence厂商会为你提供一些能在执行查询时使用的附加功能,比如Jboss的EJB3.0允许    为查询定义超时。
    Query query=entityManager.createQuery(“from Customer c”);
    query.setHint(“org.hibernate.timeout”,1000);

FlushMode
    默认的flush模式,会在em查询之前,执行flush动作(把更新同步到数据库)。如果希望在查询前不执行    flush,可以通过
    Query query=entityManager.createQuery(“from Customer c”);
    query.setFlushMode(FlushModeType.COMMIT);

EJB QL
EJB QL是按照实体的抽象持久结构来表达的,包括:抽象结构名称、基本成员属性和关系型成员属性。抽象结构名,默认是非限定类名,如果使用了
@Entity(name=”Cust”)
public class Customer{….}
那么查询Customer 的EJB QL为 select c from Cust AS c;

简单查询
    select object(c) from Customer as c 等价于select c from Customer as c

选择实体和关系型成员属性
    对于
    @Entity
    public class Customer{
        private int id;
        private String first;
        private Address address;
        @Id
        public int getId(){…..}
        public getFirstName(){return first;}
        …………
    }
    选择成员属性可以使用:
    select c.firstName from Customer as c;或者
    select c.first from Customer as c;
    选择关联的实体可以使用:
    select c.address from Customer as c;
    选择关联实体的属性可以使用:
    select c.address.city  from Customer as c;
    但是如果Address不是持久型成员,只是普通的class,上面的语句是非法的。可以使用
    @Embedded private Address address;让语句变回合法。

构造函数表达式
    可以在select子句是指定一个构造函数,用于创建普通的JAVA对象(而非实体),如:
    select new com.tian.domain.Name(c.firstName,c.lastName) from Customer c;

IN操作符和INNER JOIN
    返回所有乘客的所有预订信息
    select r from Customer as c ,in(c.reservations) r;
    等效于
    select r from Customer as c inner join c.reservations r;//inner可以省略

LEFT JOIN
    查询所有顾客及他们的电话号码,如果顾客没有电话号码以null代替
    select c.firstName ,p.number from Customer c left join c.phoneNumbers p;
    //left join可以写成left outer join

Fetch Joins
如果关系型成员属性FetchType在定义XML时(或注解)设为LAZY,那么在程序访问到这些成员时才从数据库加载数据,有时会增加数据库访问量,可以通过JOIN FETCH强制加载这些关系成员,如:
select c from customer c left join fetch c.phones;这时会提前加载Phone关联

使用DISTINCT
关键字distinct确保查询不会返回重复项。如查询所有预订舱位的顾客,由于顾客可以预订多次,所有distinct可以派上用场。
select distinct cust from Reservation as res, in (res.customers) cust;

where 子句与字面常量
where 子句用于缩小选择范围。如果使用到字符串常量,可以使用单引号括起来,如果字符串中又有一个单引号,请用两个单引号表示;如果是数值型的常量,就直接书写;如果是布尔型,常量取值用true和false。如
where name=’capital one’; where name=’wendy’’s’;where hasGoodCredit=true;
如果不想涉及这些细节,可以直接使用查询参数,让查询API处理这些问题

where 子句与运算符的优先级
点号(.)à数学运算符(+-*/)à比较运算符(=,>,like,between,in,is null,is empty,member of)à逻辑运算符(not,and or)

where子句与数学运算符
允许查询操作在做比较时执行算术运算。运算过程中,数值也许被放宽或提升,如int 与double相乘,先把int 变成double,结果也是double的

where子句和逻辑运算符

and 和or运算符的行为与java语言中的&&和||有所不同。&&只有左操作数为true时才会对右操作数求值,and要由转换出的原生语言决定

where 子句和in

    IN用来检验是否与一组字面常量中的元素相匹配,如:
    where c.address.state IN(‘FL’,’TX’,’WI’);
    也可以使用参数
    where c.address.state IN(?1,?2,?3,5.7);
where 子句与is null
    比较运算符is null允许检验路径表达式是否为null。它也可以用来检验输入参数,如
    select c from Customer as c
    where :city is not null and :state is not null
    and c.address.state=:state

where 子句与is empty

is empty检验集合类型的关系是否为空(没有元素),集体类型的关系是从不会为null的。对from子句已经被赋予标识符的集合型关系使用is empty是非法的,如:
select r from Reservation as r inner join r.customers as c //已经赋予标识符c,表明c一定不为空
where r.customers is not empty;

where 子句与member of

member of用于判断某个实体是否是集合型关系的一个成员,如
where cust not member of  res.customers

where子句与like

可以使用两个特殊的字符“%”(表示任意字符序列)和“_”(表示单个字符),如果字符串本来就有%或_,可以使用“\”字符来避免冲突

函数表达式
     字符串处理函数
        LOWER(String):转换成小写
        UPPER(String):转换成大家
        TRIM([[leading|trailing|both][trim_char]from)]String):去除指定字符trim_char,默认为空格
        CONCAT(String1,String2):连接字符串
        LENGTH(String):求字符串长度
        LOCATE(String1,String2[,start]):String1在String2的什么位置
        SUBSTRING(String1,sart,length):截取字符串
     数字函数
        ABS(number):绝对值
        SORT(double):平方根
        MOD(int,int):求余数
     返回日期和时间的函数
        CURRENT_DATE:返回当前日期
        CURRENT_TIME:返回当前时间
        CURRENT_TIMESTAMP:返回当前时间戳
     聚合函数
        COUNT():返回查询结果集中的条目数
        MAX():找出最大值
        MIN():找出最小值
        AVG(numeric):平均值
        SUM(numerc):求和

ORDER BY子句
对返回集合进行排序。在EJB QL中有一个使用限制:order by子句中出现的属性,必须出现在select子句中,或者是select子句选中实体的一个属性。如:
select c from Customers as c order by c.address desc;select addr.zip from Address as addr order by add.zip;
以下是非法的
select c from Customers as c order by c.address.city desc;// city不是c的直接属性
GROUP BY 与HAVING
group by 用于分组,having对分组进一步筛选。group by子句中指定的字段必须出现于查询的返回结果中,这和SQL的要求是一致的。

子查询
    子查询是内嵌于主查询的另一个查询。EJB QL支持在where和having子句中使用子查询
    查询费用超过$100,000的所有航程
    from Cruise cr where 100000<(select sum(res.amountPaid) from cr.reservations res)
    
    ALL,ANY,SOME
    如果子查询返回多项结果,可以使用ALL、ANY和SOME对结果做进一步限定
    如果子查询中的所有内容都与条件表达式相匹配,那么操作符ALL就返回true
    查询所有预付了舱位预订定金的航程
    from Cruise cr where 0< all(select res.amountPaid from cr.reservations res)
    如果子查询中的有任意一项与条件表达式相匹配,那么操作符ALL或SOME就返回true
   
    EXISTS
    如果子查询包含一项或多项结果,那么操作符EXISTS返回true

批量的UPDATE与DELETE
    给所有名叫Bill Burke的乘客增加$10
    update Reservation res set res.amountPaid=(res.amountPaid+10)
    where exists(
        select c from res.customers c
        where c.firstName=’Bill’ and c.lastName=’Burke’
    );
    是否可以写成?
    update Reservation res set res.amountPaid=(res.amountPaid+10)
    where res.customers.firstName=’Bill’ and res.customers.lastName=’Burke’

    删除所有Bill Burke的舱位预订记录
    delect from Reservation res
    where exist(
        select c from res.customers c
        where c.firstName=’Bill’ and c.lastName=’Burke’
    )

原生查询
EntityManager接口有三个创建原生查询的方法:一个返回标量值,一个返回实体类型,还有一个返回多个实体与标量值组合

标量原生查询
createNativeQuery(String sql);

简单实体的原生查询

createNativeQuery(String sql,Class entityClass);根据某个实体定义好的映射元数据,将返回值映射到该实体

复杂原生查询

createNativeQuery(String sql,String mappingName)
    返回多个实体
        @Entity
        @SqlResultSetMapping(name=”customerAndCreditCardMapping”,//映射名
                entities={@EntityResult(entityClass=Customer.class),//entities指定映射的实体
                    @EntityResult(entityClass=CreditCard.class,
           fields={@FieldResult(name=”id”,column=”CC_ID”),//指定实体内成员与返回字段的映射
                    @FieldResult(name=”number”,column=”number”)})
                        })
        public class Customer{………}
        等价XML
        <entity-mappings>
            <sel-result-set-mapping name=” customerAndCreditCardMapping”>
                <entity-result entity-class=”com.titan.domain.Customer”/>
                <entity-result entity-class=”com.titan.domain.CreditCard”>   
                    <field-result name=”id” column=”CC_ID”/>
                    <field-result name=”number” column=”number”/>
                </entity-result>
            </sel-result-set-mapping>
        </entity-mappings>
        使用方法
        String sql=”select c.id,c.firstName,cc.id As CC_IC,cc.number from CUST_TABEL
           c,CREDIT_CARD_TABLE cc….”
        manager.createNativeQuery(sql,”customerAndCreditCardMapping”);
       
   返回结果既有标量也有实体
        @SqlResultSetMapping(name=”reservationCount”,//映射名
                entities={@EntityResult(entityClass=Cruise.class,              
                        fields={@FieldResult(name=”id”,column=”id”) })},
                columns={@ColumnsResult(name=”resCount”)}//标量
                )
        @Entity
        public class Cruise{……}
        等价XML
        <entity-mappings>
            <sel-result-set-mapping name=” reservationCount”>
                <entity-result entity-class=”com.titan.domain.Cruise”>   
                    <field-result name=”id” column=”id”/>
                </entity-result>
                <column-result name=”resCount”>
            </sel-result-set-mapping>
        </entity-mappings>
        使用方法
        String sql=”select c.id,count(Resrvation.id) as resCount from Cruise c left join
             Reservation on c.id=………..”;
        manager.createNativeQuery(sql,” reservationCount”);

具名EJB QL查询
    预先定义好EJB QL或原生的SQL查询
    使用@javax.persistence.NamedQuery用来预定EJB QL的,NamedQuerys用于定义多条查询
    @NamedQuerys({
        NamedQuery(name=”getAverageReservateion”,//名字
            query=”select AVG(r.amountPaid) from Cruise As c Join c.reservatons r where
                 c=:cruise”),//EJB QL
        NamedQuery(……)
    })
    @Entity
    public class Cruise{…….}
    等价XML
    <entity-mapping>
        <named-query name=” getAverageReservateion”>
            <query>
                EJB QL
            </query>
        </ named-query >
    </entity-mapping >
    使用方式
    Query query=em.createNamedQuery(“getAverageReservateion”);
    query.setParameter(“cruise”.cruise);

具名原生查询
    使用@javax.persistence.NamedNativeQuery注解来预定义具名原生SQL查询
    @NamedNativeQuery(
        name=”findCustAndCCNum”,
        query=”select ……..”,//原生SQL
        resultClass=”…”,//只返回一个实体时用
        resultSetMapping=”….”
        //一个声明的@SqlResultSetMapping,用于返回多个实体和或实体与标量混合的查询
    )
等价XML
    <entity-mappings>
        <named-native-query name=” getAverageReservateion” result-set-mapping=”….”>
            <query>
                原生SQL
            </query>
        </ named-native-query >
    </entity-mappings >
    使用方式
    Query query=em.createNamedQuery(“getAverageReservateion”);
    query.setParameter(“cruise”.cruise);
N32G003学习——第九章 第三节1 串口 发送 经过第九章前2节的学习,基础打下之后,开始敲代码。 阅读详情

相关推荐

Ejb QL语言

Ejb QL语言。希望对爱学习编程语言的人有所帮助。

EJB笔记四 ——持久化实体管理器

 配置文件persistence.xmlpersistence>  persistence-unit name="example">    jta-data-source>java:/DefaultMySqlDSjta-data-source>    properties>      property name="hibernate.hbm2ddl.auto" value="creat

待定的专栏 1852

EJB3_Persistence开发手册-EJB3_QL查询

详细介绍了EJB3中关于实体bean的增删改查等操作,并给出了多种示例,非常详细。

EJB-QL 语言参考(推荐)

本文描述EJB-QL 语言EJB-QL 语言EJB-QL 用来在CMP类型的EJB中描述 finders和select 方法。设计这种语言的目的是严格的描绘内存对象的查询,而不是数据库的查询。 但是EJB-QL的语法 SQL非常相似。 他有三个基本语句: SELECT, FROM, WHERE.。通过这几个语句可以实现各种各样的组合。本文的目的不是解释 EJB-QL的各种用法。我们会给出

Senton 3748

EJB QL查询语言

转载:http://bbs.51cto.com/thread-39001-1.html EJBQL查询语言 EnterpriseJavaBeansQueryLanguage,简称EJBQL,是用于对容器管理持久性的EntityBean的查询进行定义的语言。EJBQL使EntityBean的查询方法的语义定义更具可移植性。1.概述EJBQL是用于容器管理持久性EntityBean中f...

weixin_30680385的博客 201

EJBQL查询语言

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 938

EJB3查询

be

undergrowth的专栏 1048

EJB3.0笔记-实体查询EJB QL

在java persistence中,可以同时使用EJB QL查询语言和原生的SQL来完成查询操作。由于EJB QL是一种描述Java对象的查询语言,而entity manager会为你处理由EJB QL向原生SQL转换的工作,因此它具有跨数据库厂商实现的移植能力。EJB QL比SQL更加紧凑和更容易阅读,但是EJB QL不可能都支持数据库所有私有特性,所以功能上没有厂商原生SQL那么功能全面。

林踪翼影的专栏 4043

EJB3.0笔记

转帖自 http://blog.sina.com.cn/s/blog_5016113a0100asqq.html EJB3.0笔记-1 Entity回调和监听器在你执行EntityManager的persist()、merge、remove和find方法时,或者在执行EJB QL查询时,一系列预先定义好的生命周期事件会被触发。Java Persistence规范允许在entity cl

icecityman的专栏 3284

EJB的学习

pojo 就是普通的javabeanioc 就是控制反转 或成为依赖注入,容器控制组件,权利由程序转移到容器控制,很多的操作都是由容易去实现。 java的元数据批注 annotation @Entity@Table(name="helloTable")public class HelloEntityBean(){//the entity class must hav

likaifeng123的专栏 1391

EJB-QL语言FIND 实体BEAN

很多应用(程序)需要使用特定的条件在数据库中查找实体BEANS。借助EJB-QL查询语言,实体BEANS可以在HOME接口中定义Find方法,通过实体BEAN的属性来查询。加一个FIND方法需要做2步:  在HOME接口加一个FIND方法  在BEAN的部署描途中加入EJB-QL查询。Resin-CMP使用EJB2.0规范的EJB-QL查询语言。EJB-QL类似SQL,为了适合于操作实体BEAN,

haroyy的专栏 1776

EJB3.0介绍

EJB3.0介绍 转自:http://www.builder.com.cn/2007/0907/495423.shtml 在本文中将对新的规范进行一个概要性的介绍,包括新增的元数据支持,EJBQL的修改,实体Bean模型访问bean上下文的新方法和运行时环境等等。作者还讨论了EJB在未来要作出的调整以及EJB3.0其他开发规范之间的关系。 开始无论如何由于EJB的复杂性使

沙振中 832

EJB QL 查询

来自:http://blog.sina.com.cn/s/blog_5016113a0100asnl.html          系列笔记 在java persistence中,可以同时使用EJB QL查询语言和原生的SQL来完成查询操作。由于EJB QL是一种描述Java对象的查询语言,而entity manager会为你处理由EJB QL向原生SQL转换的工作,因此它具有跨数据库厂商

学徒ZSX 902

EJB 3.0规范简介

 EJB ( Enterprise JavaBeans )技术是一种J2EE技术,用于开发和部署基于组件的业务应用程序。使用EJB架构编写的应用程序是可伸缩的、事务性的,并且是多用户安全的。   虽然EJB架构具有丰富的功能,但其复杂性阻碍了它的广泛应用。在EJB领域,竞争性技术纷至沓来。例如,O/R映射技术(如Toplink和开源的 Hibernate框架)已经超越EJB,成为开发持久性解决方

leagle 1852

ejb 2.0 3.0_Eclipse的EJB V3.0数据库持久性

在应用程序开发领域发生的一件事是数据的可用性。 有来自各种资源的各种数据。 一方面,这使应用程序比以往更加丰富。 另一方面,所有这些数据实在是一团糟。 如果您需要持久存储数据而不是仅仅读取数据,它将变得更加复杂。 在Java环境中,EJB已成为一种可靠的持久性方式,同时保持了良好的可维护性和适当的角色分离。 EJB V3.0继续了这一发展,带来了更多的工具和选项。 使用EJB并不困难。 借...

cuxiong8996的博客 938

EJB3 QL查询

EJB3 QL查询 EJB3查询语言是一种和SQL非常类似的中间性和对象化查询语言。它可以被编译成不同的底层数据库能接受的SQL,从而屏蔽不同数据库的差异,确保用EJB3 QL查询语言编写的代码可在不同的数据库上运行。比起EJB 2.1的查询语言,EJB3可以运行期构造,支持多态,远远比EJB 2.1的查询更灵活和功能强大。在程序中使用EJB3 QL可以使用大写(SELECT)或者小写(sel...

taotao111的专栏 233

J2EE学习笔记七:EJB查询语言(EJB Query Language)

实体Bean为底层数据库提供了一个面向对象的抽象,同时它还能够创建一些业务方法,通过这些方法可以操作实体Bean中包含的数据。为了提高数据操作的方便性以及效率,J2EE提供了一种类SQL的语言EJB Query Language,缩写为EJB-QL,这就像我们在Hibernate中所使用的HQL(Hibernate Query Language)一样。通过利用EJB-QL,我们可以在实体bean的

鱼与飞鸟 2540

EJB查询

参考网址:http://blog.csdn.net/senton/archive/2007/03/08/1524432.aspx 1.创建Query查询对象的三种方式 (1)JPQL查询 (2)命名查询(Named) (3)本地查询(Native) 2.三种返回形式 (1)getResultList():一般返回实体集合类型:List<Customer> resul...

weixin_30535913的博客 188

倾斜摄影数据,osgb格式的

采集的武汉一个景点的osgb格式的倾斜摄影数据模型,供大家学习测试用

上一篇: jquery表单验证validate插件全攻略
下一篇: Hibernate With关键字
dcb2008
博客等级 码龄19年 5粉丝 98原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值