JPA--JPQL(五)

Java  Persistence  Query  Language(Java持久化查询语言)
一、JPQL定义
        #  JPQL是一种可移植的查询语言,可以被编译成所有主流数据库服务器上的SQL
        #  JPQL是面向对象的,通过面向对象而非面向数据库的查询语言查询数据,在Java空间对类和对象进行操作,避免程序的SQL语句紧密耦合
        #  使用javax.persistence.Query接口代表一个查询实例
二、创建JPQL实例
        JPQL通过EntityManager来生成Query实例:EntityManager提供使用JPQL(或原生SQL)创建Query的方法:
        【方法】                                                                                                                                【用途】
        public  Query  createQuery(String  sqlString);                                                                使用JPQL语句创建动态查询
        public  Query  createNamedQuery(String  name);                                                        在命名查询的基础上创建查询实例,此方法可以用于JPQL和原生SQL查询
        public  Query  createNativeQuery(String  sqlString);                                                     使用包含UPDATE或DELETE等等原生SQL语句创建动态查询
        public  Query  createNativeQuery(String  sqlString,  Class  result-class);               使用原生SQL语句创建检索单一实体类型的动态查询
        public  Query  createNativeQuery(String  sqlString,  String  result-setMapping);    使用原生SQL语句创建检索多个实体结果集合的动态查询
三、Query接口执行数据查询的部分方法:
        #  getSingleResult():单一查询结果
        #  getResultList():多个查询结果
        #  setParameter:
                Query  setParameter(int  position,  Object  value):通过参数位置号绑定查询语句中的参数
                Query  setParameter(String  name,  Object  value):绑定命名参数
        #  setMaxResults:设置返回的最大结果数
        #  executeUpdate:新增、删除或者更改的语句,通过该方法执行
【返回单一查询结果的程序代码】
        @Test
        public  void  findPerson()  throws  Exception{
                javax.persistence.EntityManager  em = emf.createEntityManager();
                Person  p = (Person)em.createQuery("select  p  from  Person  p  where  p.name = :name")        //  类似HQL
                                                            .setParameter("name",  "创")
                                                            .getSingleResult();        //  设定查询的参数值
                assertEquals(p.getName(),  "创");
                assertEquals(p.getSurname,  "伟");
        }
        ......
【返回多个查询结果的程序代码】
        @Test
        public  void  findPersons()  throws  Exception{
                javax.persistence.EntityManager  em = emf.createEntityManager();
                List<Person>  p = (List<Person>)em.createQuery("select   p  from  Person  p  where  not(p.name = : name)")
                                                                                   .setParameter("name",  "创")        //  设定查询的参数值
                                                                                   .getResultList();        //  返回查询结果列表
                assertEquals(p.size(),  2);
                assertEquals(p.get(0),  getName(),  "伟");
                assertEquals(p.get(1),  getName(),  "黄");
        }
四、JPQL支持三种语句类型,可以在查询中使用JPQL执行选择、更新、删除操作:
                【语句类型】                                【描述】
                SELECT                                检索实体或与实体有关的数据
                UPDATE                                更新一个或多个实体
                DELETE                                删除一个或多个实体
五、定义和使用Select:
        SELECT  c  FROM  Category  c  WHERE  c.categoryName  LIKE  :categoryName  ORDER  BY  c.categoryId;
        该JPQL查询具有如下内容:
        SELECT子句:指定要检索的对象类型、实体或值;
        FROM子句:指定其它子句是使用的实体声明;
        可选的WHERE,过滤查询返回的结果;
        可选的ORDER  BY子句,排序查询检索到的结果;
        可选的GROUP  BY子句,执行聚合;
        可选的HAVING子句,执行与聚合结合的过滤。
六、JPQL条件表达式和操作
                  【操作符类型】                                        【操作符】
                        定        位                                                .
                        一元符号                                                +、-
                        算        术                                                *、/、+、-
                        关        系                                                =、>、>=、<、<=、<>、
                                                                                        [NOT] BETWEEN、[NOT] LIKE、[NOT] IN
                                                                                        IS [NOT] NULL、IS [NOT] EMPTY、[NOT] MEMBER OF
                        逻        辑                                                NOT  AND  OR                                                
七、字符串函数
                字符串函数可以在JPQL查询的SELECT子句中使用,这些函数的唯一用途是过滤查询结果。
                如果希望对数据执行任何字符串操作,就必须使用Java语言中可用的函数。主要原因在于应用程序在内存中维护字符串比在数据库中进行同样操作要快很多。
        #  CONCAT(string  1,  string  2):返回两个字符串或字面量连接后的值
        #  SUBSTRING(string,  position,  length):返回从position开始长度为length的子字符串
        #  LOWER(string):将一个字符串string转换成小写形式
        #  UPPER(string):将一个字符串string转换成大写形式
        #  LENGTH(string):返回字符串string的长度,为整数
        #  TRIM(  [  [  LEADING |  TRAILING  |  BOTH  ]  [  trim_character  ]  FROM  ]  string_to_trimmed):剪切特定字符,得到新字符串。剪切方式可以是LEADING、TRAILING 或[ BOTH ]。如果没有指定trim_character,则剪切空白
        #  LOCATE(searchString,  stringToBeSearched  [  initialPosition  ]  ):返回给定字符串在另一个字符串中的位置。如果没有指定initialPosition,则从position  1 开始检索
八、算术函数
                                【算术函数】                                                 【描述】
                ABS(simple_arithmetic_expression)                        返回绝对值
                SORT(simple_arithmetic_expression)                    返回平方根的双精度值 
                MOD(num,div)                                                                返回对怒目、div执行取模操作的结果
                SIZE(collection  value  path  expression)                 返回集合中项目的数量
九、时间函数
                     【时间函数】                                                 【描述】
                CURRENT_DATE                                               返回当前日期   
                CURRENT_TIME                                                返回当前时间
                CURRENT_TIMESTAMP                                   返回当前时间标记
十、JPQL投影:在SELECT子句中使用构造器表达式
                可以在SELECT子句中使用构造器返回一个或多个饭Java实例。当你希望从子查询中检索到的数据初始化的查询中创建实例时,这一特性特别有用:
                SELECT  NEW  actionbazaar.persistence.ItemReport(c.categoryID,  c.createdBy)  FROM Category  c
                指定的类不必映射到数据库,也不必是实体。
        【使用聚合】:
                #  聚合函数:AVG、COUNT、MAX、MIN 和 SUM
                #  通过GROUP  BY 和 HAVING 分组
        【排序】:ORDER  BY
        【使用子查询】:
                #  可以在WHERE 和HAVING 子句中使用子查询,EJB3.1的FROM子句中不支持;
                #  可以在子查询中使用IN、EXISTS、ALL、ANY 和 SOME            
        【连接实体】:
                #  关联联结:INNER  JOIN
                #  外联结:LEFT  JOIN  或  LEFT  OUTER  JOIN
                #  获取联结:JOIN  FETCH
十二、JPQL--Update 和 Delete
                大数据量的更新、删除,可以用EntityManager进行实体的更新操作,也可以通过查询语言执行数据表的字段更新,记录删除的操作
                #  UPDATE  PollOption  p  SET  p.optionItem = :value  WHERE  p.optionId = :optionId
                #  DELETE  FROM  PollOption  p  WHERE  p.optionId = :optioned
       












        
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值