Spring JPA-在JpaRepository或Crudepository中使用本机查询插入批量大小的列表

Spring JPA-在JpaRepository或Crudepository中使用本机查询插入批量大小的列表,spring,hibernate,jpa,Spring,Hibernate,Jpa,更新:感谢@M.Deinum通知我如何使用EntityManager getReference或JpaRepository getOne函数处理@manytone级联问题。我现在可以使用基本的JParePSitoryMethod进行批量保存,如下所示: @Transactional public void insertCommands(List<CommandDto> dtos) { final List<Command> commands

更新:感谢@M.Deinum通知我如何使用EntityManager getReference或JpaRepository getOne函数处理@manytone级联问题。我现在可以使用基本的JParePSitoryMethod进行批量保存,如下所示:

    @Transactional
    public void insertCommands(List<CommandDto> dtos) {
        final List<Command> commands = new ArrayList<>();

        for (CommandDto dto : dtos) {
            ZonedDateTime now = ZonedDateTime.now();
            final Request request = requestRepository.getOne(dto.getRequestId());
            String commandId = UUID.randomUUID().toString();
            final Command command = new Command();

            command.setId(commandId);
            command.setCreatedBy(SYSTEM);
            command.setCreatedTimestamp(now);
            command.setStatus(dto.getStatus());
            command.setContent(dto.getContent());
            command.setSendOnDate(dto.getSendOnDate());
            command.setRequest(request);
            commands.add(command);
        }
        commandRepository.saveAll(commands);
    }

我正在寻找一种在JpaRepository或Crudepository中使用nativequery插入它们的方法,语法如下,但允许多行:

    @Modifying
    @Transactional
    @Query(nativeQuery = true, value = "INSERT into command (id, created_by, created_timestamp, " +
            "   updated_by, updated_timestamp, status, content, send_on_date, request_id) " +
            "VALUES  (:id, :createdBy, :createdTimestamp, :updatedBy, :updatedTimestamp, " +
            "   :status, :content, :sendOnDate, :requestId) ")
    int batchInsertCommandDto( @Param("commands")  List<CommandDto> commandDtos);

而CommandDto对象只有字段“requestId”。这意味着,如果我只是尝试创建一个仅使用requestId的请求对象,entityManager将无法保存,因为请求对象未完全形成,因此无法识别。为保存的每个命令检索请求对象的效率非常低,因此我希望按照上面的nativequery中所示进行映射。

您不需要检索
请求
您可以使用
getRefence
获得浅层引用。因此,与其解决所有问题,不如试试这个,或者放弃这个,使用一个
jdbc模板
进行简单的批量更新。尽管我强烈建议继续使用JPA,让它来处理。谢谢,@M.Deinum。我将尝试使用浅层引用进行保存。@M.Deinum,还有几个后续问题:getReference是进行数据库调用,还是只是创建对象的代理?此外,如果“ManyToOne”引用具有级联类型,这是否会带来任何潜在问题?它将创建一个惰性代理,关于这个引用,我并不知道,但这应该很容易测试,其次,我相信Hibernate(或JPA)足够聪明来处理它。
    @Modifying
    @Transactional
    @Query(nativeQuery = true, value = "INSERT into command (id, created_by, created_timestamp, " +
            "   updated_by, updated_timestamp, status, content, send_on_date, request_id) " +
            "VALUES  (:id, :createdBy, :createdTimestamp, :updatedBy, :updatedTimestamp, " +
            "   :status, :content, :sendOnDate, :requestId) ")
    int batchInsertCommandDto( @Param("commands")  List<CommandDto> commandDtos);
    @ManyToOne(optional = false, fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
    @JoinColumn(name = "request_id", foreignKey = @ForeignKey(name="fk_rcommand_request_id"))
    private Request request;