英文:
How find an object list without a parameter in method with JpaRepository, Spring-boot
问题
需要使用JpaRepository获取对象列表,但在某些情况下,方法中可能缺少一个变量。例如:
如果我需要 findByNombreCursoContainsIgnoreCaseAndAreaBean,但我没有变量 **Area**,我该怎么办?为每个查询情况创建特定的方法吗?是否存在一种方法,我可以将Area的值传递为null,并获得所有领域的查询?
将会是
findByNombreCursoContainsIgnoreCaseAndAreaBean("example", null);
通过这样可以获取所有具有 "example" 和所有领域的列表。
我在尝试做什么?我在我的应用程序中想要实现一个搜索功能:我认为这不是最优解:
public Page<Curso> searcher(String nombreCurso, Area area, int activo, Pageable pageable){
try {
if(nombreCurso.isEmpty() && area!=null && area.getIdArea() == 0 && activo == 2) {
return getAll(pageable);
} if(area.getIdArea() == 0 && activo == 2) {
return repo.findByNombreCursoContainsIgnoreCase(nombreCurso, pageable);
} if(activo != 2 && area.getIdArea() == 0) { // 0 = descatalogado / 1 = Activo
return repo.findByNombreCursoContainsIgnoreCaseAndActivo(nombreCurso, new Integer(activo).byteValue(), pageable);
} if(activo != 2){
return repo.findByActivo(new Integer(activo).byteValue(), pageable);
}else {
return repo.findByNombreCursoContainsIgnoreCaseAndAreaBean(nombreCurso, area, pageable);
}
} catch(Exception ex) {
return getAll(pageable);
}
}
英文:
I need to get an object list with JpaRepository but in some cases I don`t have one of the variables in method. For example:
If I need findByNombreCursoContainsIgnoreCaseAndAreaBean but I don´t have the variable Area, what I should do? create specifics methods for each case of my queries? Exists a method in which I can pass null value for Area and get the query for all the areas?
will be
findByNombreCursoContainsIgnoreCaseAndAreaBean("example", null);
and with this get all the list with "example" and all areas.
What I'm trying to do? A searcher in my application: I think this is not optimum:
public Page<Curso> searcher(String nombreCurso, Area area, int activo, Pageable pageable){
try {
if(nombreCurso.isEmpty() && area!=null && area.getIdArea() == 0 && activo == 2) {
return getAll(pageable);
} if(area.getIdArea() == 0 && activo == 2) {
return repo.findByNombreCursoContainsIgnoreCase(nombreCurso, pageable);
} if(activo != 2 && area.getIdArea() == 0) { // 0 = descatalogado / 1 = Activo
return repo.findByNombreCursoContainsIgnoreCaseAndActivo(nombreCurso, new Integer(activo).byteValue(), pageable);
} if(activo != 2){
return repo.findByActivo(new Integer(activo).byteValue(), pageable);
}else {
return repo.findByNombreCursoContainsIgnoreCaseAndAreaBean(nombreCurso, area, pageable);
}
} catch(Exception ex) {
return getAll(pageable);
}
}
答案1
得分: 1
方法1:尝试使用 Optional
findByNombreCursoContainsIgnoreCaseAndAreaBean (.., Optional<Area> areaOption,.){
// 一些代码
if (optionalArgument.isPresent()) {
进行某些操作(optionalArgument.get());
} else {
进行其他操作();
}
}
方法2:从 REST 接收数据
1. 使用可选的请求参数,设置默认值,然后调用相应的方法
@GetMapping("/api/foos")
@ResponseBody
public void getFoos(@RequestParam(required = false) String id) {
进行某些操作(id);
}
**或者**
2. 使用默认值
为请求参数设置默认值
@GetMapping("/api/foos")
@ResponseBody
public void getFoos(@RequestParam(defaultValue = "test") String id) {
进行某些操作(id);
}
英文:
Way 1 . Try Optional
findByNombreCursoContainsIgnoreCaseAndAreaBean (..,(Optional<Area> areaOption,.){
// some code
if (optionalArgument.isPresent()) {
doSomething(optionalArgument.get());
} else {
doSomethingElse();
}
}
Way 2: While receiving data from REST <br> <hr>
1. Optional Request Parameters using ie set the default value and then call respective methods
@GetMapping("/api/foos")
@ResponseBody
public void getFoos(@RequestParam(required = false) String id) {
doSomething(id);
}
OR
-
Using Default Value <br>
A Default Value for the Request Parameter@GetMapping("/api/foos")
@ResponseBody
public void getFoos(@RequestParam(defaultValue = "test") String id) {
doSomething(id);
}
答案2
得分: 1
你可以使用org.springframework.data.domain.Example。将实体模型放入示例中,并通过该示例进行查询。由于仅将nombre字段设置如下,查询条件仅考虑该字段。如果您设置了除null以外的更多字段,则还会将其添加到搜索条件中。
Curso curso = new Curso();
curso.setNombre(5);
Page<Curso> page = cursoRepository.findAll(Example.of(curso), pageable);
更多信息请参阅:https://www.baeldung.com/spring-data-query-by-example
英文:
You can use org.springframework.data.domain.Example. An entity model is put into example and queried by that. Since only nombre field is set as below, query criteria is build considering just that field. If you set more fields other than null, those are also added to search criteria
Curso curso = new Curso();
curso.setNombre(5);
Page<Curso> page = cursoRepository.findAll(Example.of(curso),pageable);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论