Spring数据JPA存储库方法重载

Spring数据JPA存储库方法重载,spring,hibernate,orm,spring-data-jpa,Spring,Hibernate,Orm,Spring Data Jpa,例如,我有一本书JPA。Book有一个名为Name的字段,Book repository有一个方法findOneByName作为jpa repository方法命名约定。但是我需要在不同的用例中使用两个不同版本的findOneByName。一个版本是带锁注释的,另一个是无锁的。像这样: public interface BookRepository extends JpaRepository<BookDAO, Long> { @Lock(LockModeType.READ)

例如,我有一本书JPA。Book有一个名为Name的字段,Book repository有一个方法findOneByName作为jpa repository方法命名约定。但是我需要在不同的用例中使用两个不同版本的findOneByName。一个版本是带锁注释的,另一个是无锁的。像这样:

public interface BookRepository extends JpaRepository<BookDAO, Long> {

   @Lock(LockModeType.READ)
   BookDAO findOneByName( String name );

   BookDAO findOneByName( String name );
}

有可能在春季实现这一目标吗?如果是,那么在调用它们时如何区分这两个方法。如果没有,在仍然使用像findOneBy***这样的Spring JPA存储库接口的情况下,是否还有其他方法可以做到这一点。

我不知道是否可以用您的方法做到这一点。但我会创造不同的方法

 public interface BookRepository extends JpaRepository<BookDAO, Long> {

   @Lock(LockModeType.READ)
   @Query("select b from Book b where b.name = :name")
   BookDAO findOneByNameForRead( String name );

   BookDAO findOneByName( String name );

}

我不知道你是否能做到。但我会创造不同的方法

 public interface BookRepository extends JpaRepository<BookDAO, Long> {

   @Lock(LockModeType.READ)
   @Query("select b from Book b where b.name = :name")
   BookDAO findOneByNameForRead( String name );

   BookDAO findOneByName( String name );

}
根据本文,我们可以使用以下前缀命名查询方法:find…By、read…By、query…By、count…By和get…By

因此,BookDAO findByNameString name和BookDAO getByNameString name方法将执行相同的操作。

根据我们可以使用以下前缀命名查询方法:find…By、read…By、query…By、count…By和get…By


因此,BookDAO findByNameString name和BookDAO getByNameString name方法将执行相同的操作。

我不会对其中一个使用查询方法。我将为@Lock one创建一个新方法,并将其称为findOneByNameWithLockname。然后使用@Query注释并为其指定查询。不,不是这样,与Spring无关,而是与Java的工作方式有关。@M.Deinum谢谢。关于这个用例,你有一些建设性的建议吗?如何用另一种方法来做呢?请看@LucasP的评论。我只是不想对其中一种方法使用查询方法。我将为@Lock one创建一个新方法,并将其称为findOneByNameWithLockname。然后使用@Query注释并为其指定查询。不,不是这样,与Spring无关,而是与Java的工作方式有关。@M.Deinum谢谢。关于这个用例,你有一些建设性的建议吗?如何以另一种方式进行操作?请参阅@LucasP的评论。它将不起作用。第二个方法调用第一个方法,相当于直接调用第一个方法。在em.find和em.lock之间,另一个事务有可能获得实体上的锁。如果发生这种情况,em.lock可能会失败,这取决于事务隔离级别。它将无法工作。第二个方法调用第一个方法,相当于直接调用第一个方法。在em.find和em.lock之间,另一个事务有可能获得实体上的锁。如果发生这种情况,em.lock可能会失败,这取决于事务隔离级别。