• [转] JPQL


    原文地址:http://blog.csdn.net/suncaishen/article/details/6512028

    select name ,age from user; //原生SQL语句

    select u.name,u.age from User u;  //JPQL语句

    select u from User u;  //JPQL语句

    SQL语句是在数据库空间中对字段,列,行进行操作

    JPQL语句是在EJB实体空间中面向对象,属性进行操作

    JPQL必须由JPA的JPQL解析器解析为SQL才能执行,必须先获取Query对象

    参数查询

    1命名参数查询

    entityManager.createQuery("select u from User u where u.age=:param");

    query.setParameter("param",24);

    List<User> result=(List<User>)query.getResultList();

    2位置参数查询

    "select u from User u where u.age=?1"

    query.setParameter(1,24);    

     3实体参数(JPQL中除了基本类型外,还可以是对象类型)

    "select u from User u where u.person=?1"

    Person p=new Person();

    p.setId(1);

    query.setParameter(1,p);

    JPQL运算符

    算术运算符  +  - *  /

    关系运算符  =  >   <   >=   <=   <>

    逻辑运算符   between ,like , in , is null,is empty,member of,not ,and ,or

    1 not

    "select u from User u where not(u.cityid=?1)"

    2  between和sql中一样

    3  in    在给定的值列表中查询

    "select u from User u where u.cityid in(1,2,3)"

    4 like       (   _  表示一个字符,%表示任意数量字符 )

    xxxx  where u.name like ' 张% '

    5 is null      (实体的属性是否为空,即实体属性映射的字段是否为空)

    "select u from User u where u.cityid is null"

    6 is empty        (与is null 不同的是,它针对实体的集合属性 内有没有元素。

                               虽然集合对象是存在的,但是集合内没有元素)

    select o from Order o where o.orderItems is empty

    条件查询

    1排序查询       asc升序  desc降序

    order by p.age desc,p.birthday asc

    2聚合函数查询

    avg() 平均值,返回Double     count()返回Long       max()          min()         sum()

    以上除了count外其它的函数的参数对应的是 单个的字段,即属性而不是对象

    HAVING和WHERE的区别。一个是先分组,再对组进行筛选;一个是先筛选,然后对筛选后的记录进行分组。

    构造器查询

    "select new  com.jsun.Person(p.name) from Person p"

    Person有这个构造器时,即Person(String name),成功返回对象。

    关联查询(实际工作中仍然会有这种需求)

    left join 允许右边实体表达式的实体为空,这里的实体指 集合属性

    inner join 右边必须存在

    "select o from Order o inner join o.orderItems"

    默认查询中,集合属性是懒加载的。只有用的时候JPA才会再发SQL语句

    在查询的时候我们希望一次全抓取出来怎么办?用 fetch  

    (其实left join和inner join在这里使用主要是为了配合fetch,一次抓取,因为默认的是懒加载)

    "select o from Order o inner join fetch o.orderItems"

    排除相同记录DISTINCT   

    select distinct o from Order o

    (还可以配合聚合函数使用)

    如 select  count(distinct o) from Order o

    JPQL内置函数

    字符串函数

    concat(str1,str2)

    substring(string,position,length)

    trim( [leading | trailing | both]  sub_str  from str)

    upper(str)

    lower(str)

    length(str)

    locate(searchString,initPosition)

    日期,时间函数

    CURRENT_DATE                       //返回当前日期(这是数据库端的时间)

    CURRENT_TIME           //返回当前时间

    CURRENT_TIMESTAMP       //返回当前日期时间

    数学函数

    ABS(number)    //绝对值

    SQRT(number)  //平方根

    MOD(num,div)//取模

    SIZE(collection)    //返回集合中元素的数量

    如:select o from Order o where size(o.items)>10

    使用子查询

    xxxx  in(子查询)

    xxxx  not in(子查询)   

    exists(子查询)

    not exists(子查询 )       exists存在的意思 即子查询的结果不为空就是存在

    分页查询

    用到了query接口的两个方法

    setMaxResults(int)                //设置获取多少条记录

    和setFirstResult(int)//结果集开始的索引,索引默认从0开始

    以上两个方法都返回Query对象所以可以组成方法链

    query.setMaxResults(max).setFirstResult(index).getResultList()

    批量操作(批量更新和批量删除)

    建议将所有批量操作与不连续的事务隔离开,

    批量操作可能造成受管实体与数据库的不一致

    原生SQL查询与调用存储过程(EJB3.0不支持以OUT参数的形式返回的存储过程)

    Query query=entityManager.createNativeQuery(" {call pro_1(?)} ");

    query.setParameter(1,"jsun");

    //无返回值存储过程

    query.executeUpdate();

    //返回单个值的存储过程

    String result=(String)query.getSingleResult();

    //返回全部列的存储过程

    List<User> results=(List<User>)query.getResultList();

    //返回部分列的存储过程

    List<Object[]> results=(List<Object[]>)query.getResultList();

    for(Object[] row:results){

    row[0],row[1]

    }

  • 相关阅读:
    本地项目上传至GitHub
    博客园上传markdown格式文章
    Spring boot快速入门
    洛谷P1279 字串距离
    洛谷P2758 编辑距离
    POJ 堆栈基本操作
    洛谷P2815 IPv6地址压缩
    喵的Unity游戏开发之路
    喵的Unity游戏开发之路
    喵的Unity游戏开发之路
  • 原文地址:https://www.cnblogs.com/dirgo/p/5186181.html
Copyright © 2020-2023  润新知