`
xiaofan_0204
  • 浏览: 126461 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JPA查询实体部分字段

    博客分类:
  • JPA
阅读更多
JPA本地查询中如果只想查询出实体的部分字段,可以通过返回方式为列模式的方法来实现!
首先建表(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中使用的返回模式为实体,是不能查询出实体的部分字段!必须指定全部实体字段……太恶心了!
分享到:
评论
1 楼 studysoft 2013-03-11  
终于找到把这个方法说清楚的文章了

相关推荐

    Spring Data Jpa – 获得实体类部分字段(单表或多表)

    一、单表查询的一个字段、一条数据 @Query(value = select username from user,nativeQuery = true) // 注意返回值用String类型接收,也可以使用Object String findOneUserName(); 二、单表查询的一个字段、多条...

    JPA实体映射对时间字段的处理

    ### JPA实体映射对时间字段的处理 在Java持久化框架中,JPA(Java Persistence API)是一种广泛采用的标准,用于管理关系型数据库中的对象/关系映射。本文将详细探讨在使用JPA进行实体映射时如何处理时间字段,并...

    解决 Springboot Jpa 自动创建表 和字段乱序问题[凤凰小哥哥]

    产生原因:因为使用 jpa 自动创建表的时候,采用的是TreeMap的,我们要变成LinkedHashMap 的结构。 解决方案:在项目下java文件夹下创建包名为: org.hibernate.cfg ,创建类: PropertyContainer [包名,类名...

    JPA视频教程_使用jpa映射单个实体对象

    通过学习本教程,你将掌握如何使用JPA的注解来定义实体、映射字段和关系,并了解如何在Spring框架中配置和使用JPA进行数据操作。这将帮助你在实际项目中更高效地处理数据库交互,降低业务逻辑和数据访问层的耦合。

    jpa 别名转实体

    别名转实体是JPA中的一个概念,它涉及到如何通过别名来查询数据库并映射到对应的实体类上。 在JPA中,我们经常需要处理SQL查询结果,这些结果可能包含别名,例如在HQL(Hibernate Query Language)或JPQL(Java ...

    Intellij Idea 数据库生成JPA实体的模板

    生成JPA的实体,带annotation,包括@Entity,@Table(name=xx),@Id,@GeneratedValue,@Column(name=xx) 输出表和字段的comment,包含字段的类型长度 自动生成包名

    jpa的实体映射关系7种

    通常通过`@OneToOne`注解来实现,可以设置`mappedBy`属性来指定对方实体中的关联字段。 2. **双向一对一**: 双向一对一关系意味着两个实体都包含对彼此的引用。每个实体都有一个指向对方的属性,并使用`@OneToOne...

    06_传智播客JPA详解_大数据字段映射与字段延迟加载

    映射过程涉及到定义实体类中的属性,并使用特定的JPA注解(例如`@Lob`)来指示这些属性应如何与数据库中的大数据字段对应。通过这样的映射,JPA可以帮助我们在Java代码中方便地存取和操作这些大数据字段。 接下来,...

    05_JPA详解_日期_枚举等字段类型的JPA映射.zip

    JPA实体配置 实体类需要使用`@Entity`注解标识,表名可通过`@Table`注解指定。属性与数据库列的映射使用`@Column`注解。主键的映射可以使用`@Id`,复合主键则使用`@IdClass`或`@EmbeddedId`。 ### 6. 映射关系 ...

    jpa查询详解

    在上面的示例代码中,我们定义了一个名为 `findPersonById` 的命名查询,该查询用于检索 Person 实体根据 id 字段。 JPA 查询提供了多种方式来检索和操作数据,包括 JPQL 查询、本地查询和命名查询。了解这些查询...

    springboot jpa 自动生成实体类的 文件 Generate POJOs.groovy

    springboot jpa 自动生成实体类的 文件 可以拿走直接用 Generate POJOs.groovy

    jpa例子jpajpa

    它们通常带有`@Entity`注解,表明这个类是一个JPA实体。例如: ```java @Entity public class User { @Id private Long id; private String name; // getters and setters } ``` 这里的`User`类就是一个实体,`@...

    05_传智播客JPA详解_日期_枚举等字段类型的JPA映射

    JPA提供了Java Persistence Query Language,类似于SQL,用于查询实体。JPQL支持复杂的查询,如聚合函数、子查询和连接查询。 7. **自定义转换器**: 对于标准JPA不直接支持的复杂类型,可以使用`@Converter`注解...

    JPA返回实体或Map及dwr分页.zip

    然后,使用JPA的`EntityManager`接口查询数据库,例如`entityManager.find()`方法可以直接获取到对应ID的实体对象,而`Query`对象的`getResultList()`则能返回所有匹配的实体列表。 其次,**JPA返回Map对象**。有时...

    JPA实体关联(hibernate实现)

    **JPA实体关联(Hibernate实现)** Java Persistence API (JPA) 是Java平台上的一个标准,用于管理和持久化Java对象到关系数据库。它提供了一种面向对象的方式来操作数据,而Hibernate是JPA的一个流行实现。在JPA中,...

    hibernate实体映射文件字段设置默认值

    ### Hibernate实体映射文件字段设置默认值 在Hibernate框架中,实体映射文件(通常为`.hbm.xml`)用于定义Java对象与数据库表之间的映射关系。这其中包括了属性到数据库表列的映射、主键生成策略、以及一些高级特性...

    openjpa实体标识的生成策略

    在OpenJPA中,实体标识(Entity Identifier)的生成策略是数据持久化过程中不可或缺的一部分,因为确保实体的唯一性对于数据库的正确性和一致性至关重要。OpenJPA提供了四种不同的策略来生成实体标识,使得开发者...

    jpa单表递归树形结构实现

    通过定义自关联的实体类、配置JPA仓库以及编写适当的查询方法,可以轻松地实现对树形数据的CRUD操作。在实际应用中,还需考虑性能优化,如分页加载、懒加载等策略,以避免大量数据导致的效率问题。

    Excel生成Java 带JPA注解的实体类

    接着,我们需要设计一个Excel模板,每行代表一个Java字段,列可能包含以下信息:字段名、字段类型、是否为主键、是否为自增、JPA注解(例如@Basic、@Column、@Id等)。 编写Java代码时,我们使用POI API来读取Excel...

    Pro JPA2 精通JPA2

    4. **缓存机制**:JPA提供了一级缓存和二级缓存,分别用于缓存实体对象和查询结果,提高应用程序的性能。 5. **事件监听器**:允许在实体生命周期的特定点触发自定义代码,例如,在实体保存前进行预处理或在实体删除...

Global site tag (gtag.js) - Google Analytics