假设一个实体 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;
}
2条答案
按热度按时间1l5u6lss1#
如果我理解正确,您需要一种从
Person
作为api调用中的查询参数。建议为此添加一个dto,如下所示。
现在你可以包括这个
DTO
因为端点方法中的参数(可以识别)应该如下所示:你可以加上
PersonDTO
属性javax.validation.constraints@Valid
在dto上添加注解以添加一些验证。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<>();
}