gpt4 book ai didi

spring-data-jpa - 规范和(空)多对一关系

转载 作者:行者123 更新时间:2023-12-04 23:49:25 26 4
gpt4 key购买 nike

我有一个 MVC Controller ,它以 JSON 形式返回联系人列表。在前端,我使用 jquery 数据表插件。前端有一个搜索字段来过滤实体列表。

我的实体:

@Entity
public class Contact implements Serializable {

protected final static Logger LOGGER = LoggerFactory.getLogger(Contact.class);

private static final long serialVersionUID = -3691953100225344828L;

@Id
@GeneratedValue(generator = "hibernate-uuid")
@Column(length = 36, unique = true)
private String id;

@Version
@JsonIgnore
private int version;

private String firstname;
private String lastname;

@ManyToOne
private Company company;

... GETTER/SETTER ...
}


@Entity
public class Company implements Serializable {

protected final static Logger LOGGER = LoggerFactory.getLogger(Company.class);

private static final long serialVersionUID = -7863930456400256944L;

@Id
@GeneratedValue(generator = "hibernate-uuid")
@Column(length = 36, unique = true)
private String id;

private String companyName;
private String companyName1;
private String companyName2;

... GETTER/SETTER ...
}

我对搜索字段使用服务器端处理,在服务器端我使用规范。
public class ContactSpecifications {

public static Specification<Contact> contactFirstnameLike(final String needle) {
return new Specification<Contact>() {

@Override
public Predicate toPredicate(Root<Contact> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
return cb.like(cb.lower(root.<String> get(Contact_.firstname)), needle != null ? needle.toLowerCase() : null);
}
};
}

public static Specification<Contact> contactLastnameLike(final String needle) {
return new Specification<Contact>() {

@Override
public Predicate toPredicate(Root<Contact> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
return cb.like(cb.lower(root.<String> get(Contact_.lastname)), needle != null ? needle.toLowerCase() : null);
}
};
}

public static Specification<Contact> contactFullnameLike(final String needle) {
return new Specification<Contact>() {

@Override
public Predicate toPredicate(Root<Contact> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
return cb.or(cb.like(cb.lower(root.<String> get(Contact_.lastname)), needle != null ? needle.toLowerCase() : null), cb.like(cb.lower(root.<String> get(Contact_.firstname)), needle != null ? needle.toLowerCase() : null));
}
};
}

public static Specification<Contact> contactCompanyCompanyNameLike(final String needle) {
return new Specification<Contact>() {

@Override
public Predicate toPredicate(Root<Contact> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
final Path<Company> company = root.<Company> get(Contact_.company);
return cb.like(cb.lower(company.<String> get(Company_.companyName)), needle != null ? needle.toLowerCase() : null);
}
};
}
}

我的数据库查询
 contactRepository.findAll(specifications, new PageRequest(0,100));

和规范是
 specifications = Specifications.where(ContactSpecifications.contactFullnameLike(needle)).or(ContactSpecifications.contactCompanyCompanyNameLike(needle));

针是来自前端的搜索键和带有周围 % 的掩码(例如“%asdf%”)

我的问题是,如果联系人没有公司,则规范无法按预期工作。

例如,我有 3 个联系人:
  • 姓氏:Schmitz,名字:Max,公司:(空)
  • 姓氏:Schmitz,名字:Moritz,公司:XY
  • 姓氏:Muster,名字:Max,公司:XY
  • 如果我现在输入 Schmitz 作为搜索键,则只返回联系人 2,不返回联系人 1。
  • 如果我输入 max 作为搜索键,则只返回联系人 3,联系人 1 而不是
  • 仅当搜索键为空/空时,所有联系人返回

  • 我想念什么?

    亲切的问候
    里齐

    最佳答案

    回答我自己;)

    在研究了 sql 查询后,我找到了解决方案。我必须重写我的规范。在相关实体上,我必须添加一个左连接路径以防止标准构建器自动使用交叉/内部连接。

    内连接仅返回实体,即设置了所有字段。如果某个实体关系为空,则该实体将从结果列表中删除。正常的内部连接行为。

    所以...

    正确的规范应该是这样的。

    public static Specification<Contact> contactCompanyCompanyNameLike(final String needle) {
    return new Specification<Contact>() {

    @Override
    public Predicate toPredicate(Root<Contact> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
    final Join<Contact,Company> company = root.join(Contact_.company, JoinType.LEFT);
    return cb.like(cb.lower(company.<String> get(Company_.companyName)), needle != null ? needle.toLowerCase() : null);
    }
    };
    }

    通过这个小的修改,它现在开始正常工作。

    亲切的问候 Rizzi

    关于spring-data-jpa - 规范和(空)多对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26214165/

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