我想在我的图书租赁项目中使用依赖倒置原则。之前,我使用了扩展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
}
``}
,因为我有很多使用JPQL的方法,所以我需要知道如何在方法内部实现它。
答案 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();