I'm working on a spring boot project, there I have two tables that are related to each other with OneToMany relationship
public class PackGroupEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String description; private Double qty; private Integer packingNr; @Temporal(TemporalType.TIMESTAMP) private Date deliveredTime; @OneToMany(mappedBy = "packGroup", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) private List<PackArticlesEntity> packArticles= new ArrayList<>(); } And
public class PackArticlesEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Double qty; private Double confirmedName; @Enumerated(EnumType.STRING) private ArticleStatus status; private Double weight; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "pack_group_id") private PackGroupEntity packGroup; } And I insert data on these two tables in a loop, first I group the articles by packing number for which I will create a PackGroup that has a list of articles:
Map<Integer, List<RecivedArticlesDTO >> groupedArticles = recivedArticlesListDTO.stream().collect(Collectors.groupingBy(RecivedArticlesDTO::getPackingNr)); for (Map.Entry<Integer, List<RecivedArticlesDTO>> entry : groupedArticles.entrySet()) { List<RecivedArticlesDTO > groups = entry.getValue(); PackGroupEntity packGroup = new PackGroupEntity(); packGroup.setPackingNr(entry.getKey()) //some manipulations and setting data for each field List<PackArticlesEntity> listWithArticles = new ArrayList<>(); groups.forEach(pack -> { PackArticlesEntity packArticle= new PackArticlesEntity(); packArticles.setQty(pack.getQty); //some manipulations and setting data for each field listWithArticles.add(packArticles); } packGroup.setPackArticles(listWithArticles); // here I have to save the data using native query packGroupService.savePackGroupData(packGroup); } In this way, it is so slow so I wanted to do it on the native query. The problem is that I have many packGroups a many packArticles that needs to be saved. I was thinking to somehow do only one connection with DB to send the list of pack groups and pack articles to save, but I don't know how to do this on native queries. This here is just for one pack_group but yet I don't know how to pass packArticles on a native query since it's a list
@Query(value = "insert into pack_group " + " (id,packing_nr, description, qty, deliveredTime, packArticles) " + " values (1?, 2?, 3?, 4?, 5?, 6?)", nativeQuery = true) void savePackGroupData(id, packing_nr, description, qty, packArticles); Can someone help with this, please?
EDIT: I want to return the id from insert on
String query = String.format("insert into pack_group(group, remark, description ) " + "values ( %s, %s, %s)", "x","y","z" ); Query q = entityManager.createNativeQuery(query ); BigInteger biid = (BigInteger) q.getSingleResult(); long id = biid.longValue(); And I get this error com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set.