spring data jpa自定义bean字段映射

本文内容纲要:spring data jpa自定义bean字段映射

当遇到复杂多表查询时,并且同时还需要确保查询性能,此时则需要使用自定义sql查询,然而spring data jpa对于自定义sql则需使用查询需要在对应的bean中做太多的配置映射,我尝试了一下,最终还是没成功。故选择了另一种方式来解决。

     String sql = "select a.name,b.className,a.createTime from A a left join B b on a.id = b.id";

     Query query = entityManager.createNativeQuery(sql);

    //此方法是将数据集合转换位map类型的List集合

    //query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(HashMap.class));

List<Object[]> resultList = query.getResultList();

List<MyEntity> list = CommonUtils.castEntity(resultList, MyEntity.class);

使用entityManage创建nativeQuery,此时获取到的结果集返回的数据是 List<Object[]> 类型的,由于我所需要的字段仅只有name,className,createTime,故构造对应的bean。

public class MyEntity {

private String name;

private String className;

private Long createTime;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getClassName() {

return className;

}

public void setClassName(String className) {

this.className = className;

}

public Long getCreateTime() {

return createTime;

}

public void setCreateTime(Long createTime) {

this.createTime = createTime;

}

  //必须构建的构造方法,含有查询列所有的对应的字段

public MyEntity(String name, String className, BigInteger createTime) {

this.name = name;

this.className = className;

this.createTime = createTime != null ? createTime.longValue() : null ;

}

public MyEntity() {

}

}

由于数据库中createTime保存的是Long型,发现用 entityManager 获取到的是 BigInteger ,故构造方法的参数类型设为BigInteger,是为了便于数据做转换。

/**

* 数组集合转化为指定对象集合

* 指定的实体对象必须包含所以字段的构造方法,数组的元素的顺序将和构造方法顺序和类型一一对应

* @param list

* @param clazz

* @param <T>

* @return

* @throws Exception

*/

public static <T> List<T> castEntity(List<Object[]> list, Class<T> clazz) throws Exception {

List<T> returnList = new ArrayList<>();

if (list.size() == 0){

return returnList;

}

Class[] c2 = null;

Constructor[] constructors = clazz.getConstructors();

for (Constructor constructor : constructors){

Class[] tClass = constructor.getParameterTypes();

if (tClass.length == list.get(0).length){

c2 = tClass;

break;

}

}

//构造方法实例化对象

for(Object[] o : list){

Constructor<T> constructor = clazz.getConstructor(c2);

returnList.add(constructor.newInstance(o));

}

return returnList;

}

上面方法则是对数据进行了转换,通过反射构造方法进行实例化对象。返回目标类型的List集合。

本文内容总结:spring data jpa自定义bean字段映射

原文链接:https://www.cnblogs.com/suiyueqiannian/p/6626414.html

以上是 spring data jpa自定义bean字段映射 的全部内容, 来源链接: utcz.com/z/362341.html

回到顶部