【发布时间】: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”才能得到好的结果。
对于扩展对象,我没有“喜欢”的方法。
请问我如何通过此加入请求请求?
【问题讨论】:
-
this 是一个类似的问题。
-
感谢@JBNizet 我找到了解决方案
标签: java spring-boot spring-data-jpa criteria