gpt4 book ai didi

java - 如何使用 Spring JPA 仅使用对象的某些部分编写查询

转载 作者:行者123 更新时间:2023-12-02 08:41:25 25 4
gpt4 key购买 nike

我觉得这应该非常简单,但我不确定它的实际代码。基本上,我的其余 Controller 接受 6 个参数,将其通过 Service 传递,然后使用这些参数在 ServiceImplementation 内部构建对象。从那里,我使用刚刚创建的对象返回对我的存储库的调用。此调用应尝试查询数据库中对象的特定参数。

这个查询是我不确定如何使用 Spring JPA 标准编写的部分。我只想使用我设置对象的变量,但我不确定是否必须编写查询,或者 spring JPA 是否可以使其变得更简单?

代码:

Controller :

@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);
}
}

repo :

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

}

最佳答案

如果我理解正确的话,您正在尝试根据可能存在或不存在的过滤值进行动态查询。如果是这种情况,您可以使用 Specification动态创建查询的类:

首先,在您的 Repository 类中,扩展 JpaSpecificationExecutor<ExampleLetter> :

@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());
}

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

欲了解更多详情,请查看 here , here ,或this回答。

关于java - 如何使用 Spring JPA 仅使用对象的某些部分编写查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61368776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com