jpa 数组字段_JPA查询实体部分字段

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 list = (List)query.getResultList();

List neList = castEntity(list, NativeEntity.class);

for(NativeEntity ne : neList){

System.out.println(ne.getTid() + ":" + ne.getUsername());

}

//persistEntity(factory, entityManager);

}

/**

* 通用实体转换方法,将JPA返回的数组转化成对应的实体集合,这里通过泛型和反射实现

* @param

* @param list

* @param clazz 需要转化后的类型

* @return

* @throws Exception

*/

@SuppressWarnings("unchecked")

private static List castEntity(List list, Class clazz) throws Exception {

List returnList = new ArrayList();

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 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中使用的返回模式为实体,是不能查询出实体的部分字段!必须指定全部实体字段……太恶心了!

分享到:

2011-10-23 02:23

浏览 36467

评论

1 楼

studysoft

2013-03-11

终于找到把这个方法说清楚的文章了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值