【问题标题】:JPA criteria like with OneToOne joinJPA 标准,例如 OneToOne 加入
【发布时间】:2019-11-03 02:30:33
【问题描述】:

我需要搜索包含字符串参数的数据

我有 2 个实体:

@Entity
@Table(name = "referentiel_digital")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class ReferentielDigital implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @Size(max = 200)
    @Column(name = "libelle_commercial", length = 200, nullable = false)
    private String libelleCommercial;

    @Size(max = 1000)
    @Column(name = "description_courte", length = 1000)
    private String descriptionCourte;

    @Size(max = 1000)
    @Column(name = "description_longue", length = 1000)
    private String descriptionLongue;

    @OneToOne
    @JoinColumn(unique = true)
    private Referentiel reference;

@Entity
@Table(name = "referentiel")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Referentiel implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @Column(name = "uuid", nullable = false)
    private UUID uuid;

    ....

    @OneToOne(mappedBy = "reference")
    @JsonIgnoreProperties("referentiels")
    private ReferentielDigital digital;

我开发了一个使用 JPA 标准的搜索 API。它适用于不同的领域,并加入(ManyToOne),但在这种情况下,我需要找到Referentiel,其中包含示例中的referentielDigital.descriptionLongue中的字符串。

我试试这个:

        Join<Referentiel, ReferentielDigital> digital = root.join("digital");
        Expression<String> exp1 = digital.get("libelleCommercial");


        Predicate p1 = exp1.in("%" + criteria.getLibelle() + "%");

        Expression<String> exp2 = digital.get("descriptionCourte");
        Predicate p2 = exp1.in("%" + criteria.getLibelle() + "%");

        Expression<String> exp3 = digital.get("descriptionLongue");
        Predicate p3 = exp1.in("%" + criteria.getLibelle() + "%");

        predicates.add(cb.or(p1, p2, p3));

因为request里面有“in”所以不行,我想点“like”才能得到好的结果。

对于扩展对象,我没有“喜欢”的方法。

请问我如何通过此加入请求请求?

【问题讨论】:

标签: java spring-boot spring-data-jpa criteria


【解决方案1】:

我通过 JB Nizet 帮助找到了解决方案:

        Join<Referentiel, ReferentielDigital> digital = root.join("digital");
        Expression<String> exp1 = digital.get("libelleCommercial");

        Predicate p1 = cb.like(exp1, "%" + criteria.getLibelle() + "%");

        Expression<String> exp2 = digital.get("descriptionCourte");
        Predicate p2 = cb.like(exp2, "%" + criteria.getLibelle() + "%");

        Expression<String> exp3 = digital.get("descriptionLongue");
        Predicate p3 = cb.like(exp3, "%" + criteria.getLibelle() + "%");

        predicates.add(cb.or(p1, p2, p3));

【讨论】:

    猜你喜欢
    • 2011-10-17
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 2012-01-11
    • 2022-12-17
    相关资源
    最近更新 更多