Java 如何使用SpringJPA仅使用对象的某些部分编写查询

Java 如何使用SpringJPA仅使用对象的某些部分编写查询,java,spring,spring-data-jpa,Java,Spring,Spring Data Jpa,我觉得这应该非常简单,但我不确定它的实际代码。基本上,我让我的rest控制器接受6个参数,通过服务传递这些参数,然后使用这些参数在ServiceImplementation内部构建对象。从那里,我使用刚刚创建的对象向我的回购回一个调用。此调用应尝试查询对象的数据库特定参数 这个查询是我不确定如何使用SpringJPA标准编写的部分。我只想使用设置对象时使用的变量,但我不确定是否需要编写查询,或者SpringJPA是否可以让它更简单一些 代码: 控制器: @RestController publi

我觉得这应该非常简单,但我不确定它的实际代码。基本上,我让我的rest控制器接受6个参数,通过服务传递这些参数,然后使用这些参数在ServiceImplementation内部构建对象。从那里,我使用刚刚创建的对象向我的回购回一个调用。此调用应尝试查询对象的数据库特定参数

这个查询是我不确定如何使用SpringJPA标准编写的部分。我只想使用设置对象时使用的变量,但我不确定是否需要编写查询,或者SpringJPA是否可以让它更简单一些

代码:

控制器:

@RestController
public class exampleController {

    @Autowired
    private ExampleService exampleService;

    @GetMapping("/rest/example/search")
    public exampleObj searchExample (@RequestParam(value = "exLetter") String exLetter,
            @RequestParam(value = "exLang") String exLang, @RequestParam(value = "exType")int exType, 
            @RequestParam(value = "exMethod") String exMethod, @RequestParam(value = "exCd") String exCd,
            @RequestParam(value = "exOrg") String exOrg) {

        return exampleService.getExampleLetter(exLetter, exLang, exType, exMethod, exCd, exOrg);
    }
}
例如:

public interface ExampleService {

    public ExampleLetter getExampleLetter(String exLetter, String exLang, int exType, String exMethod, String exCd, String exOrg);
}
示例服务实现:

@Service
public class ExampleServiceImpl implements ExampleService {
    @Autowired
    private ExampleRepository exampleRepo;

    @Override
    public ExampleLetter getExampleLetter(String exLetter, String exLang, int exType, String exMethod, String exCd, String exOrg) {

        ExampleLetter examp = new ExampleLetter();

        examp.setExCd(exCd);
        examp.getKey().setExampleNumber(exLetter);
        examp.getKey().setLanguageType(exLang);
        examp.getKey().setMethod(exMethod);
        examp.getKey().setMarketOrg(exOrg);
        examp.getKey().setType(exType);

        return exampleRepo.findExampleLetter(examp);
    }   
}
回购:

@存储库
公共接口示例Repository扩展了Crudepository{
}

如果我理解正确,您正在尝试根据可能存在或不存在的筛选值进行dinamic查询。如果是这种情况,您可以使用
规范
类以友好方式创建查询:

首先,在您的Repository类中,扩展
JpaSpecificationExecutor

@Repository
public interface ExampleRepository extends CrudRepository<ExampleLetter, ExampleLetterKey>, JpaSpecificationExecutor<ExampleLetter> {

}  
请注意,
JpaSpecificationExecutor
接口添加了一些实用方法供您使用,这些方法除了过滤之外,还支持排序和分页


有关更多详细信息,请检查或回答。

只需通读您键入的内容以及您链接的其他项目即可。谢谢你给出如此详尽的回答。这个示例查询看起来非常有希望。谢谢。如果答案解决了您的问题,请不要忘记“接受”它:),如果您有任何问题,请发送到这里。顺便问一下,对象ExampleLetter是否有一个名为“Key”的内部对象?是的,它确实有。为什么要问这个问题呢?在这种情况下,解决方案会稍微复杂一点(包括一组“或”SQL子句),但似乎您已经解决了所有问题。不管怎样,如果你有任何问题,我们会来帮忙的。哦,是的。完全解决了。部分原因是因为我没有在示例字母对象中创建键对象。这就是为什么我不能调用我的getkey()方法。否则,大多数其他代码都可以正常工作。
@Repository
public interface ExampleRepository extends CrudRepository<ExampleLetter, ExampleLetterKey>, JpaSpecificationExecutor<ExampleLetter> {

}  
public class GenerateQueryForExampleLetter {

    ExampleLetter exampleLetter;

    public Specification<ExampleLetter> generateQuery() {
        return new Specification<ExampleLetter>() {
            private static final long serialVersionUID = 1L;

            @Override
            public Predicate toPredicate(Root<ExampleLetter> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
                Predicate pred = null;

                List<Predicate> predicates = new ArrayList<Predicate>();

                if (this.exampleLetter.getExCd()!= null && !this.exampleLetter.getExCd().isEmpty()) {
                    predicates.add(builder.equal(root.<String>get("exCd"), this.exampleLetter.getExCd()));
                }

    ...................

                if (this.exampleLetter.getTheFieldYouNeed()!= null && !getTheFieldYouNeed.isEmpty()) {
                    predicates.add(builder.equal(root.<TheTypeOfTheField>get("theFieldYouNeed"), this.exampleLetter.getTheFieldYouNeed()));
                }


                if (!predicates.isEmpty()) {
                    pred = builder.and(predicates.toArray(new Predicate[] {}));
                }

                return pred;
            }
        };
    }

    public void setExampleLetter (ExampleLetter el) {
        this.exampleLetter = el;
    }
}
@Override
public ExampleLetter getExampleLetter(String exLetter, String exLang, int exType, String exMethod, String exCd, String exOrg) {

    ExampleLetter examp = new ExampleLetter();

    examp.setExCd(exCd);
    examp.getKey().setExampleNumber(exLetter);
    examp.getKey().setLanguageType(exLang);
    examp.getKey().setMethod(exMethod);
    examp.getKey().setMarketOrg(exOrg);
    examp.getKey().setType(exType);

    GenerateQueryForExampleLetter queryGenerator = new GenerateQueryForExampleLetter ();

    queryGenerator.setExampleLetter(examp);

    return exampleRepo.findAll(queryGenerator.generateQuery());
}