查询方法之间的区别是什么...通过,阅读...通过,查询...通过,并获得...在弹簧数据中?

时间:2016-10-05 09:04:48

标签: spring spring-data spring-data-jpa

我正在查看docs的春季数据,但没有找到使用方法read...Byget...By代替find...By的理由(通常情况下) 。 请澄清:

  • 这种方法有什么作用?
  • 或者这个方法的目的是什么?
  • 在哪些情况下更好地使用这种方法?
  • 他们之间有什么区别?

你能写一个query..By方法的例子吗?

3 个答案:

答案 0 :(得分:19)

我不知道其他子项目如何,但对于Spring Data JPA(1.10.2),这些方法将作为别名使用。每个方法调用都会生成相同的条件查询(以及相同的SQL查询)。

在内部,这些前缀之间没有区别。它仅用于查询模式匹配:

private static final String QUERY_PATTERN = "find|read|get|query|stream";

https://github.com/spring-projects/spring-data-commons/blob/8bc022ebd7097b921ae1ef6c87f0ae9fc05bba5f/src/main/java/org/springframework/data/repository/query/parser/PartTree.java#L54

remove...Bydelete...By方法使用相同的方法:

private static final String DELETE_PATTERN = "delete|remove";

答案 1 :(得分:1)

我认为这将帮助您理解。

  

两个接口之间的区别在于它们的方法的语义。 CRUD存储库“找到”了一些东西,而JPA存储库“得到了”一些东西。尽管“查找”可能根本没有结果,但是“获取”将始终返回某些内容–否则JPA存储库将引发异常。

来源:https://tuhrig.de/find-vs-get/

您也可以看到此信息。 https://softwareengineering.stackexchange.com/questions/182113/how-and-why-to-decide-between-naming-methods-with-get-and-find-prefixes

答案 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/