Критерии JPA как с присоединением OneToOne - PullRequest
0 голосов
/ 20 июня 2019

Мне нужно искать данные, которые содержат строковый параметр

У меня есть 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;

Я разрабатываю API поиска, который используетJPA Критерии.Он очень хорошо работает с различными полями и join (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));

Это не работает, потому что запрос содержит «in», и я хочу иметь «like» для получения хорошего результата.

С объектом Extension у меня нет метода «like».

Как я могу сделать запрос с помощью этого соединения, пожалуйста?

1 Ответ

0 голосов
/ 20 июня 2019

Я нашел решение с помощью JB Nizet Help:

        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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...