Java 使用谓词查询数据并使用Spring数据JPA分页
我不幸地在Java工作了一段时间,来自.net世界。撇开陈词滥调不谈,我只是想实现一个能够处理谓词使用并且必须具有分页的存储库。我找不到一个好办法来做这件事Java 使用谓词查询数据并使用Spring数据JPA分页,java,spring,oracle,jpa,spring-data,Java,Spring,Oracle,Jpa,Spring Data,我不幸地在Java工作了一段时间,来自.net世界。撇开陈词滥调不谈,我只是想实现一个能够处理谓词使用并且必须具有分页的存储库。我找不到一个好办法来做这件事 // IContactRepository.java public interface IContactRepository extends Repository<Contact,Long> { } // Application.java contactRepo.findAll(predicate, new PageReque
// IContactRepository.java
public interface IContactRepository extends Repository<Contact,Long> {
}
// Application.java
contactRepo.findAll(predicate, new PageRequest(0,10));
//IContactRepository.java
公共接口IContactRepository扩展存储库{
}
//Application.java
contactRepo.findAll(谓词,新页面请求(0,10));
我想能够找到联系人姓名包含搜索词或联系人电话号码包含搜索词,然后获得前10个匹配项
在.net世界中,如果我没有使用orm,我会使用sql server的出色TSQL来获得我想要的,但仍然坚持使用Oracle。否则,我将使用一些ORM并将lambda作为谓词传递给查询函数 我猜您正在查看
谓词
,因为您希望能够执行任意复杂的查询
但是没有findAll(谓词,可分页)
方法。
我建议您查看规范
和JpaSpecificationExecutor
。您的代码如下所示:
public interface IContactRepository extends JpaRepository<Contact,Long>, JpaSpecificationExecutor<Contact> {
}
公共接口IContactRepository扩展了JpaRepository,JpaSpecificationExecutor{
}
然后您就可以访问方法findAll(规范,可分页)
。根据您的需求,规范
是一个功能接口,因此您可以使用lambda轻松地传入实现
有关更多详细信息,请查看中的章节2.5
是规范
的Javadoc,是JpaSpecificationExecutor
此外,如果您不得不忍受Java带来的痛苦,您可能应该在
IContactRepository
:)中删除I
。Java代码通常放弃.NET实践在我的配置中,我也在使用JPA和spring。(对于静态谓词。如果要动态添加谓词(搜索词),请通知我。)
//IContactRepository.java
公共接口IContactRepository扩展了CRUDepository、Paging和SortingRepository{
列出FindByContactNameLike和ContactPhoneLike(字符串名称、字符串电话、可分页)
}
我试着用Crudepo进行Pageable,效果很好。
对于lambda,你是对的:)
在我的配置中,您的实现如下所示:
IContactRepository contactRepo = context.getBean(IContactRepository.class);
List<Contacts> results = contactRepo.findByContactNameLikeAndContactPhoneLike("%CA%","%090%" , new PageRequest(1, 20));
IContactRepository contactRepo=context.getBean(IContactRepository.class);
列表结果=contactRepo.findByContactNameLikeAndContactPhoneLike(“%CA%”,“%090%”,new PageRequest(1,20));
请查看查询创建下的1.2.2定义查询方法这是我的实现,可能对您有所帮助:
@Override
public Page<Advert> findActiveAdverts(String searchValue, String availability, Long branchId, Long categoryId, Pageable pageable) {
Page<Advert> adverts = advertRepository.findAll(new Specification<Advert>() {
@Override
public javax.persistence.criteria.Predicate toPredicate(Root<Advert> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(root.get(Advert_.ACTIVE), true));
if (!StringUtils.isEmpty(searchValue)) {
predicates.add(cb.or(
cb.like(root.get(Advert_.TITLE), "%" + searchValue + "%"),
cb.like(root.get(Advert_.EXPLANATION), "%" + searchValue + "%"))
);
}
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
}
}, pageable);
return adverts;
}
@覆盖
公共页面findActiveAdverts(字符串搜索值、字符串可用性、长branchId、长类别ID、可分页){
PageAdverts=advertRepository.findAll(新规范(){
@凌驾
public javax.persistence.criteria.Predicate toPredicate(根根目录、CriteriaQuery查询、CriteriaBuilder cb){
列表谓词=新的ArrayList();
add(cb.equal(root.get(Advert.ACTIVE),true));
如果(!StringUtils.isEmpty(searchValue)){
谓词.add(cb.or(
cb.like(root.get(广告标题),“%”+searchValue+“%”,
cb.like(root.get(广告解释),“%”+searchValue+“%”)
);
}
返回cb.and(predicates.toArray(新谓词[predicates.size()]);
}
},可分页);
返回广告;
}
是否要动态添加谓词?现在谓词需要足够动态,以便我可以对联系人姓名或联系人号码进行类似查询,并返回分页结果。向下投票,因为我认为从C#迁移到Java是一种不幸??,org.springframework.data.domain.Pageable)是我找到我试图使用的findAll变体的地方。我不知道你在哪里查看QueryDSL变体!我的错!这对我来说是我想要做的。谢谢你对我的问题不加评判。
@Override
public Page<Advert> findActiveAdverts(String searchValue, String availability, Long branchId, Long categoryId, Pageable pageable) {
Page<Advert> adverts = advertRepository.findAll(new Specification<Advert>() {
@Override
public javax.persistence.criteria.Predicate toPredicate(Root<Advert> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(root.get(Advert_.ACTIVE), true));
if (!StringUtils.isEmpty(searchValue)) {
predicates.add(cb.or(
cb.like(root.get(Advert_.TITLE), "%" + searchValue + "%"),
cb.like(root.get(Advert_.EXPLANATION), "%" + searchValue + "%"))
);
}
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
}
}, pageable);
return adverts;
}