首页 > 数据库 >Oracle-JPA扩展工具-原生SQL查询并返回自定义DTO

Oracle-JPA扩展工具-原生SQL查询并返回自定义DTO

时间:2024-02-28 13:34:03浏览次数:29  
标签:实体类 return 自定义 JPA list S1 List import DTO

Java-JPA原生SQL查询返回自定义DTO:

import com.tjgeo.njsosms.framework.repository.IBaseRepository;
import com.tjgeo.njsosms.risk.support.entity.Source;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

/**
 * ${Description}
 *
 * @author wenmingming on 2020/4/13
 */
public interface SourceRepository extends IBaseRepository<Source, String> {

    Source findBySourceId(String sourceId);

    Source findBySourceIdAndShowState(String sourceId, Integer showState);

    /**
     * XX首页-风险柱形图统计
     * @return
     */
    @Query(nativeQuery = true, value = "SELECT  S1.RISKLEVEL,(SELECT S2.DICNAME FROM SYS_DICTIONARY S2 WHERE S2.DICTYPE='业务板块' AND S2.DICVALUE=S1.PLATE)BIZNAME FROM  RISK_SOURCE_DATA S1 WHERE S1.RISKLEVEL IS NOT null")
    List<Object[]> findByGroupStatics00();
    /**
     * XX首页-风险柱形图统计+线路条件
     * @return
     */
    @Query(nativeQuery = true, value = "SELECT  S1.RISKLEVEL,(SELECT S2.DICNAME FROM SYS_DICTIONARY S2 WHERE S2.DICTYPE='业务板块' AND S2.DICVALUE=S1.PLATE)BIZNAME FROM  RISK_SOURCE_DATA S1 WHERE S1.RISKLEVEL IS NOT null   AND (S1.LINEID=:lineId OR S1.LINEID='allLines')")
    List<Object[]> findByGroupStatics00AndLineId(String lineId);
}

 

Java对下转Object转Class实体对象:

import org.slf4j.Logger;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * JPA-扩展工具
 * @param
 */
public class JpaObjUtil {
    /**
     * 将数组数据转换为实体类
     * 此处数组元素的顺序必须与实体类构造函数中的属性顺序一致
     *
     * @param list           数组对象集合
     * @param clazz          实体类
     * @param <T>            实体类
     * @param model          实例化的实体类
     * @param logger  日志祖级
     * @return 实体类集合
     */
    public static <T> List<T> castEntity(Logger logger,List<Object[]> list, Class<T> clazz, Object model) {
        List<T> returnList = new ArrayList<T>();
        if (list.isEmpty()) {
            return returnList;
        }
        //获取每个数组集合的元素个数
        Object[] co = list.get(0);

        //获取当前实体类的属性名、属性值、属性类别
        List<Map> attributeInfoList = getFiledsInfo(model);
        //创建属性类别数组
        Class[] c2 = new Class[attributeInfoList.size()];
        //如果数组集合元素个数与实体类属性个数不一致则发生错误
        if (attributeInfoList.size() != co.length) {
            return returnList;
        }
        //确定构造方法
        for (int i = 0; i < attributeInfoList.size(); i++) {
            c2[i] = (Class) attributeInfoList.get(i).get("type");
        }
        try {
            for (Object[] o : list) {
                Constructor<T> constructor = clazz.getConstructor(c2);
                returnList.add(constructor.newInstance(o));
            }
        } catch (Exception ex) {
            logger.error("实体数据转化为实体类发生异常:异常信息:{}", ex.getMessage());
            return returnList;
        }
        return returnList;
    }

    /**
     * 根据属性名获取属性值
     *
     * @param fieldName 属性名
     * @param modle     实体类
     * @return 属性值
     */
    private static Object getFieldValueByName(String fieldName, Object modle) {
        try {
            String firstLetter = fieldName.substring(0, 1).toUpperCase();
            String getter = "get" + firstLetter + fieldName.substring(1);
            Method method = modle.getClass().getMethod(getter, new Class[]{});
            Object value = method.invoke(modle, new Object[]{});
            return value;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 获取属性类型(type),属性名(name),属性值(value)的map组成的list
     *
     * @param model 实体类
     * @return list集合
     */
    private static List<Map> getFiledsInfo(Object model) {
        Field[] fields = model.getClass().getDeclaredFields();
        List<Map> list = new ArrayList(fields.length);
        Map infoMap = null;
        for (int i = 0; i < fields.length; i++) {
            infoMap = new HashMap(3);
            infoMap.put("type", fields[i].getType());
            infoMap.put("name", fields[i].getName());
            infoMap.put("value", getFieldValueByName(fields[i].getName(), model));
            list.add(infoMap);
        }
        return list;
    }

}

 

扩展用例用法:

List<Object[]> queryObj=Lists.newArrayList();
if (Strings.isNotEmpty(lineId)){
queryObj=sourceRepository.findByGroupStatics00AndLineId(lineId);
}
else{
queryObj=sourceRepository.findByGroupStatics00();
}
GroupRiskStatic01Dto resultModel=new GroupRiskStatic01Dto();
List<GroupRiskStatic01Dto> riskList= JpaObjUtil.castEntity(logger ,queryObj,GroupRiskStatic01Dto.class,resultModel);

 

标签:实体类,return,自定义,JPA,list,S1,List,import,DTO
From: https://www.cnblogs.com/oumi/p/18040047

相关文章

  • eclipse自定义jak版本
    安装跟目录下eclipse.ini文件-startupplugins/org.eclipse.equinox.launcher_1.4.0.v20161219-1356.jar-vmC:\ProgramFiles\Java\jdk8u392-b08\bin--launcher.libraryplugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.500.v20170531-1133-productorg.eclips......
  • SpringBoot 1x 系列之(七)自定义starter
    自定义starterstarters原理、自定义starters如何自定义starter:​ 1、这个场景需要使用到的依赖是什么?​ 2、如何编写自动配置@Configuration//指定这个类是一个配置类@ConditionalOnXXX//在指定条件成立的情况下自动配置类生效@AutoConfigureAfter//指定自动配置类的......
  • SpringMVC系列之(六)自定义类型转换器
    自定义类型转换器SpringMVC在进行请求参数绑定时,自动进行了类型转换,前端传来的参数都是字符串,而控制器中的方法在接收时,可能会用到其他数据类型(如:Date、Integer、Double等),以日期类型为例,前端传的日期格式多样,SpringMVC自动转换类型的格式(2011/11/11)支持不了这么多类型,故有的日期......
  • PC端web通过自定义协议唤起应用
    写注册表调用WindowsRegistryEditorVersion5.00[HKEY_CURRENT_USER\Software\Classes\test]@="URL:TestProtocol"[HKEY_CURRENT_USER\Software\Classes\test\shell][HKEY_CURRENT_USER\Software\Classes\test\shell\open][HKEY_CURRENT_USER\......
  • ASP.NET Core 过滤器返回自定义响应数据
    自定义返回类publicclassApiResponse{publicintCode{get;set;}publicstringMessage{get;set;}publicobjectData{get;set;}publicApiResponse(intcode,stringmessage,objectdata=null){Code=code;......
  • 在Winform界面中使用自定义控件,丰富界面的效果处理
    我们在《SqlSugar开发框架》中,Winform界面开发部分往往也用到了自定义的用户控件,对应一些特殊的界面或者常用到的一些局部界面内容,我们可以使用自定义的用户控件来提高界面的统一性,同时也增强了使用的便利性。如我们Winform界面中用到的分页控件、附件显示内容、以及一些公司、部......
  • Springboot的starter有什么用以及如何自定义一个starter
    SpringBoot的starter是什么我们都知道SpringBoot的目的就是为了让开发者尽可能的减少项目配置专注于程序代码的编写,而'starter'就是SpringBoot简便开发、自动装配的具体实现。以‘mybatis-spring-boot-starter’为例:<dependency><groupId>org.mybatis.spring.boot<......
  • Python嵌套绘图并为条形图添加自定义标注
    论文绘图时经常需要多图嵌套,正好最近绘图用到了,记录一下使用Python实现多图嵌套的过程。首先,实现Seaborn分别绘制折线图和柱状图。'''绘制折线图'''importseabornassnsimportmatplotlib.pyplotaspltimportwarningswarnings.filterwarnings("ignore","use_inf_as_n......
  • SSH框架使用AOP代理+自定义注解遇到的相关问题总结
    1、AOP注解失效问题编写完成注解和AOP切面类时,在controller中加上注解,注解不生效。在配置文件xml中开启AOP注解:<aop:aspectj-autoproxyproxy-target-class="true"/>如果该配置以加在项目里,但是还是不生效。需要检查一下自己的项目是否是Spring.xm分层配置的。如果分层配置的,需......
  • JdbcTemplate 自定义返回的结果集字段和实体类映射
    废话不多:抄袭代码packagecom.webank.wedatasphere.qualitis.handler;importcom.webank.wedatasphere.qualitis.response.Grid;importcom.webank.wedatasphere.qualitis.response.SelectRuleResponse;importorg.springframework.beans.factory.annotation.Autowired;impo......