Spring JPA JPQLの紹介

13952 ワード

JPQL        ,    SQL       , JPQL         ,    、        , hibernate HQL   。 
 
        
JPQL                 :           。 。                      。 
 
        :“ : +    ” 
 :
Query query = em.createQuery("select p from Person p where p.personid=:Id ");
query.setParameter("Id",new Integer(1)); 
 
        “ ?+     ” 
 :
Query query = em.createQuery("select p from Person p where p.personid=?1 ");
query.setParameter(1,new Integer(1)); 
 
 
        java.util.Date   java.util.Calendar           ,           setParameter()    ,    setParameter       : 
 
public interface Query 
{ 
//          ,      java.util.Date 
Query setParameter(String name, java.util.Date value, TemporalType temporalType); 
//          ,      java.util.Calendar 
Query setParameter(String name, Calendar value, TemporalType temporalType); 
//          ,      java.util.Date 
Query setParameter(int position, Date value, TemporalType temporalType); 
//          ,      java.util.Calendar 
Query setParameter(int position, Calendar value, TemporalType temporalType); 
} 
 
     Date   Calendar              、       .          Query           ,    javax.persistence.TemporalType         setParameter   ,          java.util.Date   java.util.Calendar       SQL            。 
 
         JPQL  ,   entity Bean   Person, Order, OrderItem ,         :   Person     Order,    Order     OrderItem 。 
 
JPQL         :   Java        ,            。  , SeLeCT   sELEct    SELECT    ,   com.foshanshop.ejb3.bean.Person   com.foshanshop.ejb3.bean.PERSon     , person.name   person.NAME      。 
 
 
     
      bean     @NamedQuery or @NamedQueries              ,              BUG 。                    。 
 
        :
@NamedQuery (name= "getPerson" , query= "FROM Person WHERE personid=?1" ) 
@Entity 
public class Person implements Serializable{ 
 
           ,   @javax.persistence.NamedQueries    @NamedQuery : 
@NamedQueries ({ 
@NamedQuery (name= "getPerson" , query= "FROM Person WHERE personid=?1" ), 
@NamedQuery (name= "getPersonList" , query= "FROM Person WHERE age>?1" ) 
}) 
@Entity 
public class Person implements Serializable{ 
 
           ,              。    : 
Query query = em . createNamedQuery("getPerson") ; 
query.setParameter(1, 1); 
 
 
   (order by) 
"ASC"   "DESC"         , JPQL      asc    
 : 
//         ,            
Query query = em.createQuery("select p from Person p order by p.age desc, p.birthday asc "); 
 
       
    ,     Entity     ,          Entity     。J P QL                   ,        Entity 。    Entity          ,            
 :
//              (   ) 
Query query=em.createQuery("select p.personid, p.name from Person p order by p.personid desc "); 
//           Person,      Object[]      
List result = query.getResultList(); 
if (result!=null){ 
Iterator iterator = result.iterator(); 
while( iterator.hasNext() ){ 
Object[] row = ( Object[]) iterator.next(); 
int personid = Integer.parseInt(row[0].toString()); 
String PersonName = row[1].toString(); 
。。。。 
} 
} 
 
         (Constructor) 
JPQL                  java class       ,            。           person entity bean name and personid  ,              object[],           。          。 
 : 
public class SimplePerson { 
 private Integer personid; 
private String name ; 
   。。。。 
public SimplePerson() { 
} 
public SimplePerson(Integer personid, String name) { 
this . name = name; 
this . personid = personid; 
} 
} 
 
     :
//              SimplePerson       ,    new   。 
Query query = em.createQuery(" select new com.foshanshop.ejb3.bean.SimplePerson(p. personid, p.name) from Person p order by p.personid desc "); 
//         SimplePerson    
List result = query.getResultList(); 
if (result!=null){ 
Iterator iterator = result.iterator(); 
while( iterator.hasNext() ){ 
SimplePerson simpleperson = (SimplePerson) iterator.next(); 
。。。。 
} 
} 
 
     (Aggregation) 
JPQL           : 
1. AVG() 
2. SUM() 
3. COUNT() ,      Long ,   count(*)     hibernate    ,   toplink           
4. MAX() 
5. MIN() 
 
 :
//        
Query query = em.createQuery("select max(p.age) from Person p"); 
Object result = query.getSingleResult(); 
String maxAge = result.toString(); 
//        
query = em.createQuery("select avg(p.age) from Person p"); 
//        
query = em.createQuery("select min(p.age) from Person p"); 
//       
query = em.createQuery("select count(p) from Person p"); 
//        
query = em.createQuery("select sum(p.age) from Person p"); 
 
         select...from         ,     "GROUP BY"    。 "GROUP BY"      select                。 
 :
//             
Query query = em.createQuery(" select p.sex, count(p) from Person p group by p.sex "); 
//           Person,      Object[]      
List result = query.getResultList(); 
 
           ,     "HAVING"         "WHERE"    
 :
//        1      
Query query = em.createQuery("select p.sex, count(p) from Person p group by p.sex having count(*) >?1"); 
//          
query.setParameter(1, new Long(1)); 
//           Person,      Object[]      
List result = query.getResultList(); 
   (join) 
JPQL       SQL         : 
left out join/left join 
inner join 
left join fetch/inner join fetch 
 
 
left out join/left join  ,                 Entiies   (        left join/left outer join        。 ) 
 :
//    26       ,    Order      OrderItem 
select o from Order o left join o.orderItems where o.ower.age=26 order by o.orderid 
 
 
inner join              Entities 。 
 :
//    26       ,Order       OrderItem 
select o from Order o inner join o.orderItems where o.ower.age=26 order by o.orderid 
 
 
!!      :        , Entity              ,            ( lazy-load ) 。  , left fetch/left out fetch/inner join fetch                       。 
 :
private String QueryInnerJoinLazyLoad(){ 
//             (orderItems)      
Query query = em.createQuery("select o from Order o inner join o.orderItems where o.ower.age=26 order by o.orderid"); 
List result = query.getResultList(); 
if (result!=null && result.size()>0){ 
//      Order     orderItems(        )    
Order order = (Order) result.get(0); 
//     , EJB3 Runtime        SQL           Order   
//OrderItems 
Set<OrderItem> list = order.getOrderItems (); 
Iterator<OrderItem> iterator = list.iterator(); 
if (iterator.hasNext()){ 
OrderItem orderItem =iterator.next(); 
System.out.println ("      : "+ orderItem.getProductname()); 
} 
} 
 
        "select o from Order o inner join o.orderItems where o.ower.age=26 order by o.orderid"       SQL   (            (orderItems)        ) : 
select order0_.orderid as orderid6_, order0_.amount as amount6_, order0_.person_id as 
person4_6_, order0_.createdate as createdate6_ from Orders order0_ inner join OrderItems 
orderitems1_ on order0_.orderid=orderitems1_.order_id, Person person2_ where 
order0_.person_id=person2_.personid and person2_.age=26 order by order0_.orderid 
 
 
         Set<OrderItem> list = order.getOrderItems();         SQL            Order   OrderItems ,     SQL    : 
select orderitems0_.order_id as order4_1_, orderitems0_.id as id1_, orderitems0_.id as id7_0_, 
orderitems0_.order_id as order4_7_0_, orderitems0_.productname as productn2_7_0_, 
orderitems0_.price as price7_0_ from OrderItems orderitems0_ where orderitems0_.order_id=? 
order by orderitems0_.id ASC 
 
               。     N   Order ,       SQL         Order        ,      N         Order   orderItems     。     N+1      ,       join fetch        SQL     Order           
 
  
//    26       ,Order       OrderItem 
Query query = em.createQuery("select o from Order o inner join fetch o.orderItems where 
o.ower.age=26 order by o.orderid"); 
 
    HPQL       SQL : 
select order0_.orderid as orderid18_0_, orderitems1_.id as id19_1_, order0_.amount as 
amount18_0_,order0_.person_id as person4_18_0_, order0_.createdate as createdate18_0_, 
orderitems1_.order_id as order4_19_1_, orderitems1_.productname as productn2_19_1_, 
orderitems1_.price as price19_1_, orderitems1_.order_id as order4_0__, orderitems1_.id as id0__ 
from Orders order0_ inner join OrderItems orderitems1_ on 
order0_.orderid=orderitems1_.order_id, Person person2_ where 
order0_.person_id=person2_.personid and person2_.age=26 order by order0_.orderid, 
orderitems1_.id ASC 
 
        fetch,            SQL   ,      N+1   SQL               
 
 
        DISTINCT 
      ,            ,     : 
" select o from Order o inner join fetch o.orderItems order by o.orderid " 
   N   orderItem       N   Order,     Order         ,         DISTINCT              。 
 :
select DISTINCT o from Order o inner join fetch o.orderItems order by o.orderid 
 
 
 
   Entity 
            ,       String,        ( int, double   )          ( Integer, Double   ),      Entity     。 
 :
//           
Query query = em.createQuery("select o from Order o where o.ower =?1 order by o.orderid"); 
Person person = new Person(); 
person.setPersonid(new Integer(1)); 
//          
query.setParameter(1,person); 
 
 
     (Batch Update) 
HPQL       
 :
//           10 
Query query = em.createQuery(" update Order as o set o.amount=o.amount+10 "); 
//update      
int result = query. executeUpdate (); 
 
 
     (Batch Remove) 
 :
//      100     ,       ,       
Query query = em .createQuery( "delete from OrderItem item where item.order in(from Order as o where o.amount<100)" ); 
query. executeUpdate(); 
query = em .createQuery( "delete from Order as o where o.amount<100" ); 
query.executeUpdate(); //delete      
 
 
      NOT 
//                
Query query = em.createQuery("select o from Order o where not(o.ower =?1) order by o.orderid"); 
Person person = new Person(); 
person.setPersonid(new Integer(2)); 
//          
query.setParameter(1,person); 
 
 
      BETWEEN 
select o from Order as o where o.amount between 300 and 1000 
 
      IN 
//       26,21   Person 
select p from Person as p where p.age in(26,21) 
 
      LIKE 
//        "li"     Person 
select p from Person as p where p.name like 'li%' 
 
      IS NULL 
//            Order 
select o from Order as o where o.ower is [not] null 
 
      IS EMPTY 
IS EMPTY         (Collection)      。    NOT      。  :     Mysql     IS EMPTY 
//            Order 
select o from Order as o where o.orderItems is [not] empty 
 
      EXISTS 
[NOT]EXISTS            。 :     Mysql     EXISTS 
//          1    ,      OrderItem 
select oi from OrderItem as oi where exists (select o from Order o where o.orderid=1) 
//           10    ,    id   1   OrderItem 
select oi from OrderItem as oi where oi.id=1 and not exists (select o from Order o where o.orderid=10) 
 
 
      
JPQL            。           SQL           。  : 
1. CONCAT       
2. SUBSTRING       
3. TRIM      
4. LOWER       
5. UPPER       
6. LENGTH       
7. LOCATE       
 
 :
//       ,            "_foshan" 
select p.personid, concat(p.name, '_foshan') from Person as p 
//        ,            
select p.personid, substring (p.name,1,3) from Person as p 
 
     
HPQL          : 
ABS     
SQRT     
MOD     
SIZE        
 
 :
//      Order              
select o.orderid, size (o.orderItems) from Order as o group by o.orderid 
//      Order           /10     
select o.orderid, mod (o.amount, 10) from Order as o 
 
 
    
        WHERE   HAVING       
 :
//       26          Order 
select o from Order as o where o.ower in(select p from Person as p where p.age =26) 
 
 
      
                     ,               。               , QueryAPI                : setMaxResults( )   setFirstResult( ) 。 
 
setMaxResults             
setFirstResult                    (         3  ,            ,    0   ,    0 , 1 , 2 ) 
 
 : 
public List getPersonList( int max, int whichpage) { 
try { 
int index = (whichpage-1) * max; 
Query query = em .createQuery( "from Person p order by personid asc" ); 
List list = query. setMaxResults(max) . 
setFirstResult(index) . 
getResultList(); 
em .clear(); //       EntityManager     bean, VM       
return list; 
}