0

我有一个实体,List<>里面有一个字段。我正在尝试通过搜索字符串搜索数据库中的条目。几乎一切正常,除了我的实体hardwareCharacteristicValueList字段为null. 发生这种情况时,查询不会返回任何内容,即使我将带有现有vendormodel等的字符串传递给规范。

我究竟做错了什么?

如果我评论该行

cb.like(cb.lower(root.join(Hardware_.hardwareCharacteristicValueList).get(HardwareCharacteristicValue_.value)), "%" + search.toLowerCase() + "%")

一切正常。

实体:

import lombok.*;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

@Entity
@Table(name = "hardware")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Hardware implements Serializable {

    @Id
    @GenericGenerator(name = "hardware_id_sequence", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
            parameters = {@Parameter(name = "sequence_name", value = "SEQ_HARDWARE")})
    @GeneratedValue(generator = "hardware_id_sequence")
    @Column(name = "id", nullable = false)
    private Long id;

    @Column(name = "vendor")
    private String vendor;

    @Column(name = "model")
    private String model;

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

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "employee_id")
    private Employee employee;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "state_id")
    private HardwareState state;

    @Column(name = "is_visible",nullable = false)
    private Boolean isVisible;

    @Column(name = "comment")
    private String comment;

    @Column(name = "inspection_date")
    private Long inspectionDate;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "hardware_type_id",nullable = false)
    private HardwareType hardwareType;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "hardware")
    private List<HardwareCharacteristicValue> hardwareCharacteristicValueList;
}

规格:

public static Specification<Hardware> searchSubstring(String search) {
        return (root, criteriaQuery, cb) -> cb.or(cb.like(cb.lower(root.get(Hardware_.model)), "%" + search.toLowerCase() + "%"),
                                                    cb.like(cb.lower(root.get(Hardware_.vendor)), "%" + search.toLowerCase() + "%"),
                                                    cb.like(cb.lower(root.get(Hardware_.serial)), "%" + search.toLowerCase() + "%"),
                                                    cb.like(cb.lower(root.get(Hardware_.hardwareType).get(HardwareType_.name)), "%" + search.toLowerCase() + "%"),
                                                    cb.like(cb.lower(root.get(Hardware_.employee).get(Employee_.lastName)), "%" + search.toLowerCase() + "%"),
                                                    cb.like(cb.lower(root.join(Hardware_.hardwareCharacteristicValueList).get(HardwareCharacteristicValue_.value)), "%" + search.toLowerCase() + "%"),
                                                    cb.like(cb.lower(root.get(Hardware_.state).get(HardwareState_.name)), "%" + search.toLowerCase() + "%"));
4

1 回答 1

0

解决方案:

public static Specification<Hardware> searchSubstring(String search) {
    return (root, criteriaQuery, cb) -> cb.or(cb.like(cb.lower(root.get(Hardware_.model)), "%" + search.toLowerCase() + "%"),
                                                cb.like(cb.lower(root.get(Hardware_.vendor)), "%" + search.toLowerCase() + "%"),
                                                cb.like(cb.lower(root.get(Hardware_.serial)), "%" + search.toLowerCase() + "%"),
                                                cb.like(cb.lower(root.join(Hardware_.hardwareType, JoinType.LEFT).get(HardwareType_.name)), "%" + search.toLowerCase() + "%"),
                                                cb.like(cb.lower(root.join(Hardware_.employee, JoinType.LEFT).get(Employee_.lastName)), "%" + search.toLowerCase() + "%"),
                                                cb.like(cb.lower(root.join(Hardware_.hardwareCharacteristicValueList, JoinType.LEFT).get(HardwareCharacteristicValue_.value)), "%" + search.toLowerCase() + "%"),
                                                cb.like(cb.lower(root.join(Hardware_.state, JoinType.LEFT).get(HardwareState_.name)), "%" + search.toLowerCase() + "%"));
于 2018-07-26T11:02:22.113 回答