Spring JPA-在JpaRepository或Crudepository中使用本机查询插入批量大小的列表
更新:感谢@M.Deinum通知我如何使用EntityManager getReference或JpaRepository getOne函数处理@manytone级联问题。我现在可以使用基本的JParePSitoryMethod进行批量保存,如下所示: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
@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;