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中使用的返回模式为实体,是不能查询出实体的部分字段!必须指定全部实体字段……太恶心了!
分享到:
相关推荐
一、单表查询的一个字段、一条数据 @Query(value = select username from user,nativeQuery = true) // 注意返回值用String类型接收,也可以使用Object String findOneUserName(); 二、单表查询的一个字段、多条...
### JPA实体映射对时间字段的处理 在Java持久化框架中,JPA(Java Persistence API)是一种广泛采用的标准,用于管理关系型数据库中的对象/关系映射。本文将详细探讨在使用JPA进行实体映射时如何处理时间字段,并...
产生原因:因为使用 jpa 自动创建表的时候,采用的是TreeMap的,我们要变成LinkedHashMap 的结构。 解决方案:在项目下java文件夹下创建包名为: org.hibernate.cfg ,创建类: PropertyContainer [包名,类名...
通过学习本教程,你将掌握如何使用JPA的注解来定义实体、映射字段和关系,并了解如何在Spring框架中配置和使用JPA进行数据操作。这将帮助你在实际项目中更高效地处理数据库交互,降低业务逻辑和数据访问层的耦合。
别名转实体是JPA中的一个概念,它涉及到如何通过别名来查询数据库并映射到对应的实体类上。 在JPA中,我们经常需要处理SQL查询结果,这些结果可能包含别名,例如在HQL(Hibernate Query Language)或JPQL(Java ...
生成JPA的实体,带annotation,包括@Entity,@Table(name=xx),@Id,@GeneratedValue,@Column(name=xx) 输出表和字段的comment,包含字段的类型长度 自动生成包名
通常通过`@OneToOne`注解来实现,可以设置`mappedBy`属性来指定对方实体中的关联字段。 2. **双向一对一**: 双向一对一关系意味着两个实体都包含对彼此的引用。每个实体都有一个指向对方的属性,并使用`@OneToOne...
映射过程涉及到定义实体类中的属性,并使用特定的JPA注解(例如`@Lob`)来指示这些属性应如何与数据库中的大数据字段对应。通过这样的映射,JPA可以帮助我们在Java代码中方便地存取和操作这些大数据字段。 接下来,...
JPA实体配置 实体类需要使用`@Entity`注解标识,表名可通过`@Table`注解指定。属性与数据库列的映射使用`@Column`注解。主键的映射可以使用`@Id`,复合主键则使用`@IdClass`或`@EmbeddedId`。 ### 6. 映射关系 ...
在上面的示例代码中,我们定义了一个名为 `findPersonById` 的命名查询,该查询用于检索 Person 实体根据 id 字段。 JPA 查询提供了多种方式来检索和操作数据,包括 JPQL 查询、本地查询和命名查询。了解这些查询...
springboot jpa 自动生成实体类的 文件 可以拿走直接用 Generate POJOs.groovy
它们通常带有`@Entity`注解,表明这个类是一个JPA实体。例如: ```java @Entity public class User { @Id private Long id; private String name; // getters and setters } ``` 这里的`User`类就是一个实体,`@...
JPA提供了Java Persistence Query Language,类似于SQL,用于查询实体。JPQL支持复杂的查询,如聚合函数、子查询和连接查询。 7. **自定义转换器**: 对于标准JPA不直接支持的复杂类型,可以使用`@Converter`注解...
然后,使用JPA的`EntityManager`接口查询数据库,例如`entityManager.find()`方法可以直接获取到对应ID的实体对象,而`Query`对象的`getResultList()`则能返回所有匹配的实体列表。 其次,**JPA返回Map对象**。有时...
**JPA实体关联(Hibernate实现)** Java Persistence API (JPA) 是Java平台上的一个标准,用于管理和持久化Java对象到关系数据库。它提供了一种面向对象的方式来操作数据,而Hibernate是JPA的一个流行实现。在JPA中,...
### Hibernate实体映射文件字段设置默认值 在Hibernate框架中,实体映射文件(通常为`.hbm.xml`)用于定义Java对象与数据库表之间的映射关系。这其中包括了属性到数据库表列的映射、主键生成策略、以及一些高级特性...
在OpenJPA中,实体标识(Entity Identifier)的生成策略是数据持久化过程中不可或缺的一部分,因为确保实体的唯一性对于数据库的正确性和一致性至关重要。OpenJPA提供了四种不同的策略来生成实体标识,使得开发者...
接着,我们需要设计一个Excel模板,每行代表一个Java字段,列可能包含以下信息:字段名、字段类型、是否为主键、是否为自增、JPA注解(例如@Basic、@Column、@Id等)。 编写Java代码时,我们使用POI API来读取Excel...
通过定义自关联的实体类、配置JPA仓库以及编写适当的查询方法,可以轻松地实现对树形数据的CRUD操作。在实际应用中,还需考虑性能优化,如分页加载、懒加载等策略,以避免大量数据导致的效率问题。
4. **缓存机制**:JPA提供了一级缓存和二级缓存,分别用于缓存实体对象和查询结果,提高应用程序的性能。 5. **事件监听器**:允许在实体生命周期的特定点触发自定义代码,例如,在实体保存前进行预处理或在实体删除...