Spring Data Jpa 原生SQL返回自定义对象最简洁方式
此文章只讨论两种方式查询, 使用jpa关键字查询和自定义sql
// 方式1
1. List findByName(String name);
// 方式2
2. @Query(value = "select name from t_users where name = ?", nativeQuery = true)
List findByName2(String name);
使用接口接收
即通过定义一个接口接口 UserName,两种方式都支持通过定义接口接受返回,JPA原生支持
public interface UserName {
String getNname();
}
自定义对象接收
方式一 JAP原生支持自定义对象,但条件是而且只有一个构造函数,有些工具类需要用到默认构造函数,不方便
方式二 JAP不支持自定义对象,会返回Object[] 对象数组
解决方案
例子只是解决方式二, 如果需要解决方式一构造函数问题,可以借鉴,下面例子自己实现
我们定义一个接口ReabamDTO
public interface ReabamDTO {
}
GenericConverter实现类
内容是map 转 ReabamDTO
public final class JpaConvert implements GenericConverter {
@Override
public Set getConvertibleTypes() {
return Collections.singleton(new ConvertiblePair(Map.class, ReabamDTO.class));
}
@Override
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
return map2Pojo(source, targetType.getObjectType());
}
public static T map2Pojo(Object entity, Class tClass) {
CopyOptions copyOptions = CopyOptions.create()
.setIgnoreCase(true)
.setIgnoreError(true)
.setIgnoreNullValue(true)
.setFieldNameEditor(StrUtil::toUnderlineCase);
return BeanUtil.toBean(entity, tClass, copyOptions);
}
}
将自定义convert加入到GenericConversion