我是Spring Jpa的初学者。我脑子里有一个小虫。我想知道有什么好处和坏处:
- 处理Service类中的所有业务并多次调用Jpa Repository,它只包含CRUD,getList等基本操作。
VS
- 在Jpa存储库中进行长查询@Query
。
答案 0 :(得分:2)
通常,您始终需要调用单个查询JPA存储库,仅选择需要修改的对象。然后,您可以使用其方法直接从中加载数据并修改检索到的对象。未被查询加载的数据将在对象需要时自动加载。
例如,您可以加载某人并修改其联系地址,如下所示:
Person person = personRepository.find(personId);
for (Address address : person.getAddresses()) {
if ("CONTACT_ADDRESS".equals(address.getType()) {
address.setCity("London");
}
}
检索所有必要的数据,并将所有修改保存到数据库。
虽然这很简单易行,但有时您可能会遇到性能问题,尤其是当您只需要加载一个地址而不是所有地址时。或者,如果您总是需要所有地址,并希望与人一起在单个查询中加载它们。
然后,在存储库中引入新的优化查询是一个很好的解决方案。例如,一个查询,它将使用fetch join
加载所有地址,并且在迭代地址时不需要额外的延迟(自动)查询来加载它们:
@Query("select distinct u from User u left join fetch u.addresses where u.id = ?")
public List<User> findWithAddresses(Long id);
除了切换find()
的方法findWithAddresses()
之外,这不需要更改上述代码。但是在后台只执行单个SQL查询而不是多个SQL查询。