如何在方法中使用没有@Query批注的JPQL?

时间:2019-01-03 21:29:56

标签: java spring-boot jpql

我想在我的图书租赁项目中使用依赖倒置原则。之前,我使用了扩展AccountRepository的{​​{1}},所以我的方法如下:

CrudRepository

我已经创建了@Query("SELECT CASE WHEN COUNT(account) > 0 THEN true ELSE false END FROM Account account WHERE account.id =:accountID") boolean doesAccountExistsWithGivenID(@Param("accountID") int accountID); 和实现此存储库的类。 实现接口的类称为AccountRepository。在PostgreSQLAccountRepository内部,我想以某种方式查询以获得相同的结果。 看起来像这样:

doesAccountExistsWithGivenID

我不想使用package bookrental.account; import bookrental.bookrentals.BookRentals; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; import java.util.List; @Repository public class PostgreSQLAccountRepository implements AccountRepository { private CrudRepository<Account, Integer> repository; public PostgreSQLAccountRepository(CrudRepository<Account, Integer> repository) { this.repository = repository; } @Override public List<BookRentals> getAccountRentalsByGivenID(int accountID) { //TODO } @Override public void deleteById(Integer id) { this.repository.deleteById(id); } @Override public List<Account> findAll() { return (List<Account>) this.repository.findAll(); } @Override public boolean doesAccountExistsWithGivenID(int accountID) { //HERE I WANT TO USE JPQL } ``} ,因为我有很多使用JP​​QL的方法,所以我需要知道如何在方法内部实现它。

2 个答案:

答案 0 :(得分:0)

有关如何自定义数据存储库中的方法的文档很明确: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-implementations

基本定义要定制的接口的片段(CustomizedRepository)。在您的数据存储库中扩展此界面

interface SomeRepositry extends CrudRepository<...>, CustomizedRepository

CustomizedRepository创建名为CustomiyedRepositoryImpl的实现。 Impl后缀在这里至关重要。有关更多自定义内容,请参见文档。

答案 1 :(得分:0)

您需要自动连接SessionFactory并手动使用它。

  @Autowired
  public setSessionFactory(EntityManagerFactory factory) {
    if(factory.unwrap(SessionFactory.class) == null){
      throw new NullPointerException("factory is not a hibernate factory");
    }
    this.hibernateFactory = factory.unwrap(SessionFactory.class);
  }

访问它之后,就可以直接使用

Session session = hibernateFactory.createSession();
Query query = session.createQuery("SELECT CASE WHEN COUNT(account) > 0 THEN true ELSE false END FROM  Account account WHERE account.id =:accountID");
query.setParameter("accountId", "7277");
List list = query.list();