当前位置: 首页 > 知识库问答 >
问题:

在hibernate/jpa方法中返回具有许多数据的复杂dto的最佳方法

庄飞
2023-03-14

我有一个服务方法:

@Transactional
    @Override
    public List<DLevelsDTO> getAll(InputDTO json ){
        String idAdminPK = json.getIdAmminstrazionePK();
        Long idAdminPKDecrypted = Long.parseLong(EncrypterUtils.decrypt(idAdminPK));
        
        List<DLevels> entityList = dLevelsRepository.findAll();
        List<DLevelsDTO> resultList = new ArrayList<DLevelsDTO>();
        for(DLevels entity : entityList) {
            
            DLevelsDTO dto = Converter.convert(entity, DLevelsDTO.class);
            
            Optional<List<DUnitEntity>> optHList = dUnitsRepository.findUnit(idAdminPKDecrypted, entity.getCodiLevel());
            
            if (optHList.isPresent()) {
                
                List<DUnitDTO> jsonResponseList = new ArrayList<DUnitDTO>();
                
                List<DUnitEntity> entityHList =optHList.get();
                for(DUnitEntity entityH : entityHList) {
                    DUnitDTO jsonResponse = new DUnitDTO();
                    jsonResponse.setIdUnit(EncrypterUtils.encrypt(entityH.getSequIdUnitaOrganizzativaH()));
                    jsonResponse.setFkAdmin(EncrypterUtils.encrypt(entityH.getFkAdmin().longValue()));
                    jsonResponse.setCodiCodiceUo(entityH.getCodiCodiceUo());
                    jsonResponse.setDescDenomUo(entityH.getDescDenomUo());
                    
                    jsonResponseList.add(jsonResponse);

                }
                dto.setList(jsonResponseList);
            }
            resultList.add(dto);
        }
        return resultList;
    }

在对jpa存储库(findAll)的第一次调用中,结果长度为

最后的dto是:

列表结果列表=新的ArrayList()//

每个对象都有列表EntityList//

服务响应时间为10-15秒。。。

有没有减少服务时间的最佳方法?如果我使用Oracle表视图或递归查询而不是Java?

谢谢你的回复

共有1个答案

孟振
2023-03-14

这最好通过DTO方法和执行连接抓取的专用查询来解决。

话虽如此,我认为这是火焰持久性实体视图的完美用例。

我创建了这个库,以便在JPA模型和自定义接口或抽象类定义的模型之间进行简单的映射,类似于类固醇上的Spring数据投影。其思想是以您喜欢的方式定义目标结构(域模型),并通过JPQL表达式将属性(getter)映射到实体模型。

用例的DTO模型可以看起来像下面这样:

@EntityView(DLevels.class)
public interface DLevelsDTO {
    @IdMapping
    Long getId();
    String getName();

    // Not sure what the logic is in dUnitsRepository.findUnit()
    @Mapping("units[id = :idAdminPKDecrypted AND codiLevel = VIEW(codiLevel)]")
    List<DUnitDTO> getList();

    @EntityView(DUnitEntity.class)
    public abstract class DUnitDTO {
        private final long sequIdUnitaOrganizzativaH;
        private final long fkAdmin;

        public DUnitDTO(
            @Mapping("sequIdUnitaOrganizzativaH") long sequIdUnitaOrganizzativaH,
            @Mapping("fkAdmin") long fkAdmin
        ) {
            this.sequIdUnitaOrganizzativaH = EncrypterUtils.encrypt(sequIdUnitaOrganizzativaH);
            this.fkAdmin = EncrypterUtils.encrypt(fkAdmin);
        }

        @IdMapping
        public abstract Long getId();
        public abstract String getCodiCodiceUo();
        public abstract String getDescDenomUo();
        public long getSequIdUnitaOrganizzativaH() {
            return sequIdUnitaOrganizzativaH;
        }
        public long getFkAdmin () {
            return fkAdmin;
        }
    }
}

查询是将实体视图应用于查询的问题,最简单的就是按id进行查询。

DLevelsDTO a=entityViewManager。查找(entityManager,DLevelsDTO.class,id)

Spring数据集成允许您像使用Spring数据投影一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-数据特征

List<DLevelsDTO> findAll();

 类似资料:
  • 我使用Spring JPA规范来创建标准查询。我的代码如下所示: 我被告知这是一种糟糕的方法,我应该使用投影(DTO)从数据库中读取,因为创建实体并在之后映射它们很昂贵。问题是我不知道如何将规范与DTO相结合。要使用包含嵌套 DTO 和大量属性的复杂 DTO 来管理复杂和动态查询(来自用户输入的筛选器等)的最佳方式是什么?

  • 问题内容: 我有这样的对象: 现在我只想获取主题和ID。有没有办法像这样获得它: 因为即使只使用此查询 我只能得到这样的记录: 我不希望获得具有属性ID和主题的对象数组。实现这一目标的最好方法是什么? 问题答案: 在Spring Data JPA中,您可以使用投影: 基于接口 : 基于类 (DTO): 然后在您的仓库中创建一个简单的查询方法: 您甚至可以创建动态查询方法: 然后像这样使用它:

  • 问题内容: 我有一个使用单个数据库的企业应用程序,但是该应用程序需要支持 mysql , oracle 和 sql * server 作为安装选项。 为了 保持可移植性, 我们将 JPA批注 与 Hibernate 一起使用。我们还为每个要运行的数据库提供了一个测试平台实例。 该应用程序可以在 Maven中 很好地构建,并且我使用过 hibernate3-maven-plugin 并可以为给定的数

  • 本文向大家介绍springMVC返回复杂的json格式数据方法,包括了springMVC返回复杂的json格式数据方法的使用技巧和注意事项,需要的朋友参考一下 一、springMVC返回json格式数据常用的写法是使用@ResponseBody注解,在每一个方法前加上这个注解,springMVC的json解析机制会自动把返回值(Object类型的对象)转换为json格式的数据,如果返回的json对

  • 问题内容: 我是NHibernate(和ORMS)的新手,并试图掌握它提供的各种选择。作为参考,我将Fluent NHibernate与单独的业务对象配合使用,而后者又将DTO纯粹用于数据访问。我的应用程序体系结构必须同时支持Windows和Web“前端”。 我的选择是一般方法之一,因为似乎有很多选择。我的DTO看起来像下面的示例。每个DTO都有对ISession的引用,该引用从BO传递给它们。他

  • 问题内容: 我正在寻找一种SQL注入安全技术,以便通过PHP和MySQLi一次插入很多行(大约2000年)。 我有一个必须包含所有值的数组。目前,我正在这样做: 我尝试了call_user_func_array(),但是它引起了stackoverflow。 什么是更快的方法(例如一次将它们全部插入?),但是仍然可以防止SQL注入(如准备好的语句)和stackoverflows呢? 谢谢! 问题答案