JPA查询实体部分字段
来源:互联网 发布:mac os x 隐藏文件夹 编辑:程序博客网 时间:2024/05/21 00:52
首先声明文章来源:http://xiaofan-0204.iteye.com/blog/1207958
JPA本地查询中如果只想查询出实体的部分字段,可以通过返回方式为列模式的方法来实现!
首先建表(Oracle):
首先是实体的定义
接下来是查询
需要注意的几个点是:
1:需要查询的字段必须有相对应的构造方法,并且要一一对应,
比如说:
对应的构造方法必须是
顺序不能改变!!!!!!
2:如果@SqlResultSetMappings中使用的返回模式为实体,是不能查询出实体的部分字段!必须指定全部实体字段……太恶心了!
首先建表(Oracle):
- create table NATIVEENTITY
- (
- u_id VARCHAR2(255) not null,
- u_email VARCHAR2(255),
- password VARCHAR2(255),
- u_name VARCHAR2(255)
- )
首先是实体的定义
- package com.test.jpa;
- import javax.persistence.Column;
- import javax.persistence.ColumnResult;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.Id;
- import javax.persistence.NamedNativeQueries;
- import javax.persistence.NamedNativeQuery;
- import javax.persistence.SqlResultSetMapping;
- import javax.persistence.SqlResultSetMappings;
- @NamedNativeQueries({
- @NamedNativeQuery(
- name = "getNativeEntity",
- query = "select u_id,u_name,u_email from NativeEntity",
- resultSetMapping = "ReturnColumnEntityList"
- )
- })
- @SqlResultSetMappings({
- @SqlResultSetMapping(
- name = "ReturnColumnEntityList",
- entities = {},
- columns = {
- @ColumnResult(name = "u_id"),
- @ColumnResult(name = "u_name"),
- @ColumnResult(name = "u_email")
- }
- )
- })
- @Entity
- public class NativeEntity {
- private String tid;
- private String username;
- private String password;
- private String email;
- public NativeEntity() {
- }
- public NativeEntity(String tid, String username) {
- super();
- this.tid = tid;
- this.username = username;
- }
- public NativeEntity(String tid, String username, String email) {
- super();
- this.tid = tid;
- this.username = username;
- this.email = email;
- }
- @Column(name = "u_email")
- public String getEmail() {
- return email;
- }
- public String getPassword() {
- return password;
- }
- @Id
- @Column(name="u_id")
- @GeneratedValue
- public String getTid() {
- return tid;
- }
- @Column(name="u_name")
- public String getUsername() {
- return username;
- }
- public void setEmail(String email) {
- this.email = email;
- }
- @Column
- public void setPassword(String password) {
- this.password = password;
- }
- public void setTid(String tid) {
- this.tid = tid;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- }
接下来是查询
- package com.test.jpa;
- import java.lang.reflect.Constructor;
- import java.util.ArrayList;
- import java.util.List;
- import javax.persistence.EntityManager;
- import javax.persistence.EntityManagerFactory;
- import javax.persistence.Persistence;
- import javax.persistence.Query;
- public class NativeSql {
- @SuppressWarnings("unchecked")
- public static void main(String[] args) throws Exception {
- EntityManagerFactory factory = Persistence.createEntityManagerFactory("manager1");
- EntityManager entityManager = factory.createEntityManager();
- Query query = entityManager.createNamedQuery("getNativeEntity");
- List<Object[]> list = (List<Object[]>)query.getResultList();
- List<NativeEntity> neList = castEntity(list, NativeEntity.class);
- for(NativeEntity ne : neList){
- System.out.println(ne.getTid() + ":" + ne.getUsername());
- }
- // persistEntity(factory, entityManager);
- }
- /**
- * 通用实体转换方法,将JPA返回的数组转化成对应的实体集合,这里通过泛型和反射实现
- * @param <T>
- * @param list
- * @param clazz 需要转化后的类型
- * @return
- * @throws Exception
- */
- @SuppressWarnings("unchecked")
- private static <T> List<T> castEntity(List<Object[]> list, Class<T> clazz) throws Exception {
- List<T> returnList = new ArrayList<T>();
- Object[] co = list.get(0);
- Class[] c2 = new Class[co.length];
- //确定构造方法
- for(int i = 0; i < co.length; i++){
- c2[i] = co[i].getClass();
- }
- for(Object[] o : list){
- Constructor<T> constructor = clazz.getConstructor(c2);
- returnList.add(constructor.newInstance(o));
- }
- return returnList;
- }
- /**
- * 保存实体
- * @param factory
- * @param entityManager
- */
- @SuppressWarnings("unused")
- private static void persistEntity(EntityManagerFactory factory,
- EntityManager entityManager) {
- entityManager.getTransaction().begin();
- NativeEntity ne = new NativeEntity();
- ne.setUsername("lisi");
- ne.setPassword("3344");
- ne.setEmail("liuyong_0204@hotmail.com");
- entityManager.persist(ne);
- entityManager.getTransaction().commit();
- entityManager.close();
- factory.close();
- }
- }
需要注意的几个点是:
1:需要查询的字段必须有相对应的构造方法,并且要一一对应,
比如说:
- @ColumnResult(name = "u_id"),
- @ColumnResult(name = "u_name"),
- @ColumnResult(name = "u_email")
对应的构造方法必须是
- public NativeEntity(String tid, String username, String email) {
- super();
- this.tid = tid;
- this.username = username;
- this.email = email;
- }
顺序不能改变!!!!!!
2:如果@SqlResultSetMappings中使用的返回模式为实体,是不能查询出实体的部分字段!必须指定全部实体字段……太恶心了!
- JPA查询实体部分字段
- spring-data-jpa只查询实体部分字段
- jpa 本地查询 获取部分字段值
- spring data jpa 查询自定义字段,转换为自定义实体
- JPA查询实体属性
- Spring data jpa查询多个部分字段的方法
- Spring data jpa高级查询,部分字段查询,过滤查询,空字符过滤
- JPA中查询任意表的任意字段转实体类Dto的Util方法
- JPA教程:JPA概述、JPA实体生命周期、JPA实体映射关系、JPA查询语言
- JPA实体类自增长字段配置
- JPA使用本地查询实现联表查询,同一结果集中返回多个实体,多个字段
- 软件开发-jpa部分查询
- 利用Hibernate子查询(in) 得到部分字段(实体类的构造函数)
- hibernate查询部分字段
- Hibernate - 查询部分字段
- hibernate查询部分字段
- Mybatis查询部分字段
- JPA 查询通过别名 转实体
- 破解Sencha Architect 2.2(ExtJs Designer)
- C++中Txt文件读取和写入
- JS实现全半角转换和去空格
- 一个uwsgi配置示例
- JDK,JRE,JVM的区别
- JPA查询实体部分字段
- Android编程xml文件中fill_parent、wrap_content、match_parent三个属性的功能
- linxu vi编辑器的使用
- valgrind简介及在ubuntu上安装
- 实现Oracle数据库的自增主键
- Java 线程池的原理与实现
- hive 分区(partition)简介
- VM虚拟机和windows的共享设置
- error: crosses initialization of