JPA查询实体部分字段

首先声明文章来源:http://xiaofan-0204.iteye.com/blog/1207958

JPA本地查询中如果只想查询出实体的部分字段,可以通过返回方式为列模式的方法来实现! 
首先建表(Oracle): 
Java代码   收藏代码
  1. create table NATIVEENTITY  
  2. (  
  3.   u_id     VARCHAR2(255) not null,  
  4.   u_email  VARCHAR2(255),  
  5.   password VARCHAR2(255),  
  6.   u_name   VARCHAR2(255)  
  7. )  


首先是实体的定义 
Java代码   收藏代码
  1. package com.test.jpa;  
  2.   
  3. import javax.persistence.Column;  
  4. import javax.persistence.ColumnResult;  
  5. import javax.persistence.Entity;  
  6. import javax.persistence.GeneratedValue;  
  7. import javax.persistence.Id;  
  8. import javax.persistence.NamedNativeQueries;  
  9. import javax.persistence.NamedNativeQuery;  
  10. import javax.persistence.SqlResultSetMapping;  
  11. import javax.persistence.SqlResultSetMappings;  
  12.   
  13. @NamedNativeQueries({  
  14.     @NamedNativeQuery(  
  15.         name = "getNativeEntity",  
  16.         query = "select u_id,u_name,u_email from NativeEntity",  
  17.         resultSetMapping = "ReturnColumnEntityList"  
  18.     )  
  19. })  
  20.   
  21. @SqlResultSetMappings({  
  22.     @SqlResultSetMapping(  
  23.         name = "ReturnColumnEntityList",  
  24.         entities = {},  
  25.         columns = {  
  26.             @ColumnResult(name = "u_id"),  
  27.             @ColumnResult(name = "u_name"),  
  28.             @ColumnResult(name = "u_email")  
  29.         }  
  30.     )  
  31. })  
  32. @Entity  
  33. public class NativeEntity {  
  34.     private String tid;  
  35.       
  36.     private String username;  
  37.       
  38.     private String password;  
  39.       
  40.     private String email;  
  41.   
  42.     public NativeEntity() {  
  43.     }  
  44.   
  45.     public NativeEntity(String tid, String username) {  
  46.         super();  
  47.         this.tid = tid;  
  48.         this.username = username;  
  49.     }  
  50.   
  51.     public NativeEntity(String tid, String username, String email) {  
  52.         super();  
  53.         this.tid = tid;  
  54.         this.username = username;  
  55.         this.email = email;  
  56.     }  
  57.   
  58.     @Column(name = "u_email")  
  59.     public String getEmail() {  
  60.         return email;  
  61.     }  
  62.   
  63.     public String getPassword() {  
  64.         return password;  
  65.     }  
  66.   
  67.     @Id  
  68.     @Column(name="u_id")  
  69.     @GeneratedValue  
  70.     public String getTid() {  
  71.         return tid;  
  72.     }  
  73.   
  74.     @Column(name="u_name")  
  75.     public String getUsername() {  
  76.         return username;  
  77.     }  
  78.   
  79.     public void setEmail(String email) {  
  80.         this.email = email;  
  81.     }  
  82.   
  83.     @Column  
  84.     public void setPassword(String password) {  
  85.         this.password = password;  
  86.     }  
  87.   
  88.     public void setTid(String tid) {  
  89.         this.tid = tid;  
  90.     }  
  91.   
  92.     public void setUsername(String username) {  
  93.         this.username = username;  
  94.     }  
  95.       
  96. }  


接下来是查询 
Java代码   收藏代码
  1. package com.test.jpa;  
  2.   
  3. import java.lang.reflect.Constructor;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import javax.persistence.EntityManager;  
  8. import javax.persistence.EntityManagerFactory;  
  9. import javax.persistence.Persistence;  
  10. import javax.persistence.Query;  
  11. public class NativeSql {  
  12.       
  13.     @SuppressWarnings("unchecked")  
  14.     public static void main(String[] args) throws Exception {  
  15.         EntityManagerFactory factory = Persistence.createEntityManagerFactory("manager1");  
  16.         EntityManager entityManager = factory.createEntityManager();  
  17.         Query query = entityManager.createNamedQuery("getNativeEntity");  
  18.           
  19.         List<Object[]> list = (List<Object[]>)query.getResultList();  
  20.           
  21.         List<NativeEntity> neList = castEntity(list, NativeEntity.class);  
  22.         for(NativeEntity ne : neList){  
  23.             System.out.println(ne.getTid() + ":" + ne.getUsername());  
  24.         }  
  25.           
  26. //      persistEntity(factory, entityManager);  
  27.     }  
  28.   
  29.     /** 
  30.      * 通用实体转换方法,将JPA返回的数组转化成对应的实体集合,这里通过泛型和反射实现 
  31.      * @param <T> 
  32.      * @param list 
  33.      * @param clazz 需要转化后的类型 
  34.      * @return  
  35.      * @throws Exception 
  36.      */  
  37.     @SuppressWarnings("unchecked")  
  38.     private static <T> List<T> castEntity(List<Object[]> list, Class<T> clazz) throws Exception {  
  39.         List<T> returnList = new ArrayList<T>();  
  40.         Object[] co = list.get(0);  
  41.         Class[] c2 = new Class[co.length];  
  42.           
  43.         //确定构造方法  
  44.         for(int i = 0; i < co.length; i++){  
  45.             c2[i] = co[i].getClass();  
  46.         }  
  47.           
  48.         for(Object[] o : list){  
  49.             Constructor<T> constructor = clazz.getConstructor(c2);  
  50.             returnList.add(constructor.newInstance(o));  
  51.         }  
  52.           
  53.         return returnList;  
  54.     }  
  55.       
  56.     /** 
  57.      * 保存实体 
  58.      * @param factory 
  59.      * @param entityManager 
  60.      */  
  61.     @SuppressWarnings("unused")  
  62.     private static void persistEntity(EntityManagerFactory factory,  
  63.             EntityManager entityManager) {  
  64.         entityManager.getTransaction().begin();  
  65.         NativeEntity ne = new NativeEntity();  
  66.         ne.setUsername("lisi");  
  67.         ne.setPassword("3344");  
  68.         ne.setEmail("liuyong_0204@hotmail.com");  
  69.           
  70.         entityManager.persist(ne);  
  71.         entityManager.getTransaction().commit();  
  72.         entityManager.close();  
  73.         factory.close();  
  74.     }  
  75. }  


需要注意的几个点是: 
1:需要查询的字段必须有相对应的构造方法,并且要一一对应, 
比如说: 
Java代码   收藏代码
  1. @ColumnResult(name = "u_id"),  
  2. @ColumnResult(name = "u_name"),  
  3. @ColumnResult(name = "u_email")  

对应的构造方法必须是 
Java代码   收藏代码
  1. public NativeEntity(String tid, String username, String email) {  
  2.         super();  
  3.         this.tid = tid;  
  4.         this.username = username;  
  5.         this.email = email;  
  6.     }  

顺序不能改变!!!!!! 
2:如果@SqlResultSetMappings中使用的返回模式为实体,是不能查询出实体的部分字段!必须指定全部实体字段……太恶心了!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值