如何使用查询参数过滤数据?

tf7tbtn2  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(338)

假设一个实体 Person 具有以下字段:

@Id
@GeneratedValue(startegy = GenerationType.IDENTITY)
int id;
String name;
String surname;
int age;

在控制器上,我希望端点可以使用查询参数进行自定义,以便它可以处理各种类型的组合: /api/controller?name=John /api/controller?surname=Doe /api/controller?name=John&age=33&surname=Doe 当然,我宁愿避免手动键入所有组合。我发现使用 @Spec 您可以这样定义:

@Spec(
path = "sample",
params = { "name", "age", "surname" },
spec = //I don't know what is this
)

但这似乎不能处理所有的组合,而是我必须自己把它们组合在一起。为每个字段定义一个规范似乎是可行的,但这同样不能处理组合。
我错过了什么?我怎样才能做到这一点?
编辑:我发现了querydsl,但我似乎无法将其导入到我的项目中。我已将以下依赖项添加到pom中:

<dependency>
    <groupId>com.mysema.querydsl</groupId>
    <artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.mysema.querydsl</groupId>
    <artifactId>querydsl-apt</artifactId>
    <scope>provided</scope>
</dependency>

我使用的是Spring2.3.3.release
编辑:我已经修复了依赖项,但是,在启动应用程序时,我遇到以下异常:

java.lang.IllegalArgumentException: Did not find a query class net.mydom.net.entity.QUser for domain class net.mydom.net.entity.User!

这是我的用户实体:

@Entity
@Table(name = "users")
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;

    @Column(name = "enterprise_id")
    private String enterpriseID;

    private String username;
    private String name;
    private String password;
    private Short rol;
    private Short status;
    private String language;
    private String email;
    private Date lastLogin;
    private String image;
}
1l5u6lss

1l5u6lss1#

如果我理解正确,您需要一种从 Person 作为api调用中的查询参数。
建议为此添加一个dto,如下所示。

public class PersonDTO {
    String name;
    String surname;
    int age;

    // constructors, getter and setters

}

现在你可以包括这个 DTO 因为端点方法中的参数(可以识别)应该如下所示:

@RestController
@RequestMapping("api/controller")
class YourController {

    @GetMapping
    public PersonDTO findPerson(PersonDTO personDTO) {
        //the logic you want to add
        return personDTO;
    }

}

你可以加上 PersonDTO 属性javax.validation.constraints @Valid 在dto上添加注解以添加一些验证。

jckbn6z7

jckbn6z72#

我找到了一个使用dslquery的解决方案 pom.xml ```

com.querydsl
querydsl-jpa

}
`UserController.java`
@GetMapping("/dsl")
public List getUserDsl( @QuerydslPredicate(root = User.class) Predicate predicate) {
return service.getUsersDsl(predicate);
}
`UserService.java`
public List getUsersDsl(Predicate predicate) {
List actualList = new ArrayList<>();

Iterable<User> iterable = repository.findAll(predicate);
iterable.forEach(actualList::add);
return actualList;

}

相关问题