gpt4 book ai didi

java - 搜索嵌套对象的规范/谓词

转载 作者:行者123 更新时间:2023-11-29 09:35:22 29 4
gpt4 key购买 nike

我将 Spring Boot 与 Spring JPA 和 Specification Executor 结合使用。我的规范/谓词组合成功地在我的类中搜索了简单的属性。但是,我在搜索其中的对象时遇到了困难。他们需要单独的规范吗?我有一个类,其中有 2 个多对一映射类,我想从同一个类中搜索这些字段。

谓词实现

public Specification<User> getSpecification(SpecificationField field, Object searchCriteria){
return new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {

if(searchCriteria instanceof String){
searchCriteria.toString().trim().toLowerCase();
}

switch(field){
case USER_GROUP:
return cb.equal(cb.lower(root.<String> get("group").get("name")), searchCriteria);
case USER_ROLE:
return cb.equal(cb.lower(root.<String> get("role").get("name")), searchCriteria);
case USER_EMAIL:
return cb.equal(cb.lower(root.<String> get("email")), searchCriteria);
case USER_FIRSTNAME:
return cb.equal(cb.lower(root.<String> get("firstName")), searchCriteria);
case USER_LASTNAME:
return cb.equal(cb.lower(root.<String> get("lastName")), searchCriteria);
case USER_USERNAME:
return cb.equal(cb.lower(root.<String> get("username")), searchCriteria);
default:
assert true;
return null;
}

用户类

@Id
@GeneratedValue
@Column(name = "USER_ID")
private Long id;

@Column(name = "USER_FIRSTNAME", nullable = false)
private String firstName;

@Column(name = "USER_LASTNAME", nullable = false)
private String lastName;

@Column(name = "USER_EMAIL", nullable = false, unique = true)
private String email;

@Column(name = "USER_USERNAME", nullable = false, unique = true)
private String username;

@Column(name = "USER_PASSWORD", nullable = false)
private String encryptedPassword;

@ManyToOne
@JoinColumn(name = "USER_ROLE", nullable = false)
private Role role;

@ManyToOne
@JoinColumn(name = "USER_GROUP", nullable = false)
private Group group;

角色类

@Id
@GeneratedValue
@Column(name = "ROLE_ID")
private Long id;

@Column(name = "ROLE_NAME", nullable = false, unique = true)
private String name;

集体课

@Id
@GeneratedValue
@Column(name = "GROUP_ID")
private Long id;

@Column(name = "GROUP_NAME", nullable = false, unique = true)
private String name;

@Column(name = "GROUP_TOKEN", nullable = false, unique = true)
private String token;

-------------------------------------------- ----------------------------

编辑:

为嵌套对象提出了这个 Predicate 实现。

Root<Group> group = query.from(Group.class);
Root<Role> role = query.from(Role.class);

switch(field){
case USER_GROUP:
return cb.equal(cb.lower(group.<String> get("name")), searchCriteria);
case USER_ROLE:
return cb.equal(cb.lower(role.<String> get("name")), searchCriteria);

这工作得更好,但不是很好。我有可能的组名称值 DEV、UAT 或 PROD。如果我提供其中任何一个,我将获得数据库中的所有用户。如果我不这样做,我就不会得到任何用户。如何对该嵌套对象的名称进行文本搜索?

谢谢。

最佳答案

我自己找到了答案,但想与大家分享,以便帮助其他有同样问题的人。

@Override
public Predicate toPredicate(Root<User> userRoot, CriteriaQuery<?> query, CriteriaBuilder cb) {

switch(field){
case USER_GROUP:
Join<User, Group> groupJoin = userRoot.join("group");
return cb.equal(cb.lower(groupJoin.<String> get("name")), searchCriteria);
case USER_ROLE:
Join<User, Role> roleJoin = userRoot.join("role");
return cb.equal(cb.lower(roleJoin.<String> get("name")), searchCriteria);

使用 javax.persistence 库中的 Join 类,我可以使用相同的规范搜索类中的嵌套对象。

关于java - 搜索嵌套对象的规范/谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42465419/

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