如何将Json对象映射到JPA规范以进行搜索查询

如何将Json对象映射到JPA规范以进行搜索查询,jpa,dynamic,specifications,Jpa,Dynamic,Specifications,我有一个RequestMaping,它将搜索json类作为body参数。 我想从这个搜索json对象创建适当的规范,以便像这样传递到我的存储库: pagesResult = myRepository.findAll(mySpec) @Override public Phones searchPhones(int pageNumber, Map<String, String> searchObject) { List<PhoneSpecifica

我有一个RequestMaping,它将搜索json类作为body参数。 我想从这个搜索json对象创建适当的规范,以便像这样传递到我的存储库:

pagesResult = myRepository.findAll(mySpec)
   @Override
    public Phones searchPhones(int pageNumber, Map<String, String> searchObject) {

        List<PhoneSpecification> specificationslist = new ArrayList<>();

        generateSpecifications(searchObject, specificationslist); //fill specificationList

        Specification<Phone> specificationOfPhone;
        for (PhoneSpecification spec :
                specificationslist) {

           //this is my problem , I had to dynamically increase my Specification like this:
            specificationOfPhone = specificationOfPhone + Specifications.and(spec);

        }

mobileRepository.findAll(specificationOfPhone);
if(specificationslist.size()>0){
            finalSpecification = Specifications.where(specificationslist.get(0)) ;
        }

        for (int i=1 ; i<specificationslist.size(); i++) {
            finalSpecification = Specifications.where(finalSpecification).and(specificationslist.get(i));
        }
我在解析和向规范动态添加项方面遇到了问题。我想实现这样的目标:

pagesResult = myRepository.findAll(mySpec)
   @Override
    public Phones searchPhones(int pageNumber, Map<String, String> searchObject) {

        List<PhoneSpecification> specificationslist = new ArrayList<>();

        generateSpecifications(searchObject, specificationslist); //fill specificationList

        Specification<Phone> specificationOfPhone;
        for (PhoneSpecification spec :
                specificationslist) {

           //this is my problem , I had to dynamically increase my Specification like this:
            specificationOfPhone = specificationOfPhone + Specifications.and(spec);

        }

mobileRepository.findAll(specificationOfPhone);
if(specificationslist.size()>0){
            finalSpecification = Specifications.where(specificationslist.get(0)) ;
        }

        for (int i=1 ; i<specificationslist.size(); i++) {
            finalSpecification = Specifications.where(finalSpecification).and(specificationslist.get(i));
        }
@覆盖
公用电话搜索电话(int页码,地图搜索对象){
列表规格列表=新的ArrayList();
GenerationSpecifications(searchObject,specificationslist);//填写specificationList
电话的规格;
对于(电话规范:
规格列表){
//这是我的问题,我必须像这样动态增加我的规范:
电话的规格=电话的规格+规格和(规格);
}
mobileRepository.findAll(电话规格);

您可以将代码更改为:

Specifications<Phone> specificationOfPhone = Specifications.where(null);
for (PhoneSpecification spec : specificationslist) {
    specificationOfPhone = specificationOfPhone.and(spec);
}
specificationspecificationofphone=规格,其中(空);
用于(电话规格:规格列表){
SPECTIONOFPHONE=PHONE的规格和(spec);
}
我假设
PhoneSpecification
正在扩展/实现
Specification

规范。其中(null);
将返回可与其他规范链接的空规范


因为
规范
扩展了
规范
,您可以将其与
findAll
方法一起使用。

您可以将代码更改为:

Specifications<Phone> specificationOfPhone = Specifications.where(null);
for (PhoneSpecification spec : specificationslist) {
    specificationOfPhone = specificationOfPhone.and(spec);
}
specificationspecificationofphone=规格,其中(空);
用于(电话规格:规格列表){
SPECTIONOFPHONE=PHONE的规格和(spec);
}
我假设
PhoneSpecification
正在扩展/实现
Specification

规范。其中(null);
将返回可与其他规范链接的空规范


因为
规范
扩展了
规范
,所以您可以将其与
findAll
方法一起使用。

我最终通过添加第一个规范的位置来实现这一点,并通过如下添加来处理所有问题:

pagesResult = myRepository.findAll(mySpec)
   @Override
    public Phones searchPhones(int pageNumber, Map<String, String> searchObject) {

        List<PhoneSpecification> specificationslist = new ArrayList<>();

        generateSpecifications(searchObject, specificationslist); //fill specificationList

        Specification<Phone> specificationOfPhone;
        for (PhoneSpecification spec :
                specificationslist) {

           //this is my problem , I had to dynamically increase my Specification like this:
            specificationOfPhone = specificationOfPhone + Specifications.and(spec);

        }

mobileRepository.findAll(specificationOfPhone);
if(specificationslist.size()>0){
            finalSpecification = Specifications.where(specificationslist.get(0)) ;
        }

        for (int i=1 ; i<specificationslist.size(); i++) {
            finalSpecification = Specifications.where(finalSpecification).and(specificationslist.get(i));
        }
if(规格列表大小()>0){
finalSpecification=规格。其中(specificationslist.get(0));
}

对于(int i=1;i我最终通过将where添加到第一个规范中来实现这一点,并通过如下方式添加来处理所有问题:

pagesResult = myRepository.findAll(mySpec)
   @Override
    public Phones searchPhones(int pageNumber, Map<String, String> searchObject) {

        List<PhoneSpecification> specificationslist = new ArrayList<>();

        generateSpecifications(searchObject, specificationslist); //fill specificationList

        Specification<Phone> specificationOfPhone;
        for (PhoneSpecification spec :
                specificationslist) {

           //this is my problem , I had to dynamically increase my Specification like this:
            specificationOfPhone = specificationOfPhone + Specifications.and(spec);

        }

mobileRepository.findAll(specificationOfPhone);
if(specificationslist.size()>0){
            finalSpecification = Specifications.where(specificationslist.get(0)) ;
        }

        for (int i=1 ; i<specificationslist.size(); i++) {
            finalSpecification = Specifications.where(finalSpecification).and(specificationslist.get(i));
        }
if(规格列表大小()>0){
finalSpecification=规格。其中(specificationslist.get(0));
}

对于(int i=1;没有用于规范的方法。add()你看到我将其更改为
规范
规范
?这是一种方法
添加
。谢谢你的回答,但它不起作用。请检查我的。没有用于规范的方法。add()你看到了吗,我把它改成了
规范
规范
?这是一种方法
添加
。谢谢你的回答,但它不起作用。检查我的方法。