java - Spring Jpa 服务调用与 Jpa 查询

标签 java spring jpa

我是 Spring Jpa 初学者。我脑子里有一个错误。我想知道有什么好处和坏处:
- 处理服务类中的所有业务并多次调用仅包含基本操作(如 CRUD、getList ...)的 Jpa 存储库。

- 在 Jpa 存储库中进行长查询 @Query

最佳答案

通常,您总是需要调用单个查询 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);

除了为 findWithAddresses() 切换方法 find() 外,这不需要更改上述代码。但是后台只会执行单个 SQL 查询,而不是多个 SQL 查询。

关于java - Spring Jpa 服务调用与 Jpa 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34193716/

相关文章:

java - 我应该返回值还是使用 void?

java - Spring Oauth2无法获取访问 token 问题

java - org.eclipse.persistence.exceptions.ValidationException : Cannot add a query whose types conflict with an existing query

java - 使用 Swing Worker 加载图片

java - Jsoup 中的页面复制错误

java - IgniteCache 不调用 loadCache()

ajax - 如何使用 jquery/ajax 在 Spring Form 上填充实体对象值?

hibernate - WAS 6.1,JPA 与 JTA, hibernate ,Spring : data retrieval problem

java - Spring/Hibernate - 在 Java 中不使用 @Entity 从存储过程中获取结果

java - 使用 Gradle 运行单元测试时,最大堆大小在哪里设置?