我正在查看docs的春季数据,但没有找到使用方法read...By
,get...By
代替find...By
的理由(通常情况下) 。
请澄清:
你能写一个query..By
方法的例子吗?
答案 0 :(得分:19)
我不知道其他子项目如何,但对于Spring Data JPA(1.10.2),这些方法将作为别名使用。每个方法调用都会生成相同的条件查询(以及相同的SQL查询)。
在内部,这些前缀之间没有区别。它仅用于查询模式匹配:
private static final String QUERY_PATTERN = "find|read|get|query|stream";
remove...By
与delete...By
方法使用相同的方法:
private static final String DELETE_PATTERN = "delete|remove";
答案 1 :(得分:1)
我认为这将帮助您理解。
两个接口之间的区别在于它们的方法的语义。 CRUD存储库“找到”了一些东西,而JPA存储库“得到了”一些东西。尽管“查找”可能根本没有结果,但是“获取”将始终返回某些内容–否则JPA存储库将引发异常。
答案 2 :(得分:0)
我不知道 Spring 在过去是如何实现这一点的,但至少目前它们是相同的(只是别名)是不正确的。
Spring JPA 位于 JPA 之上。因此,这些操作中的每一个都映射到一个标准 JPA 操作:
findById(id)
-> [在 JPA] entityManager.find
虽然,
getOne(id)
-> [JPA] entityManager.getReference
那么 JPA 有什么不同呢?
entityManager.find
直接进入数据库,执行查询并在内存中获取结果。非常简单。
entityManager.getReference
使用较少(因为不知道)。这是一种懒惰查找。
也就是说,它不会直接进入数据库。它仅在使用数据时进行。它的主要目标是当您只想引用某个实体,但您不会使用该实体时。
例如:
class Customer {
Long id;
... many other fields
}
class Order {
Customer customer;
// ... other
}
您想保存一个新的 Order
:
var order = new Order();
// order.setCustomer(repo.findById(123L)); // Opt 1: goes directly to DB and load everything from this customer. But we don't need it all
order.setCustomer(repo.getOne(123L)); // Opt 2: Won't go to DB for the customer
orderRepo.saveOrUpdate(order);
您可以查看解释差异的整篇文章,并在此处查看有关 getReference
的更好信息:https://vladmihalcea.com/entitymanager-find-getreference-jpa/