Как определить множественное объединение по условию, используя данные пружины API ctiteria JPA Спецификация? - PullRequest
0 голосов
/ 31 января 2020

Ниже приведен код для извлечения соединения

public static Specification<Item> findByCustomer(User user) {
    return (root, criteriaQuery, criteriaBuilder) -> {
       root.fetch(User_.address, JoinType.LEFT);
        return criteriaBuilder.equal(root.get(User_.id), 1);
    };
}

Выше кода генерируется ниже запроса

выберите us.ALL_COLUMN, adr.ALL_COLUMN из пользователя us оставил внешнее соединение Адрес adr on us.id = adr.id где us.id = 1;

Как добавить несколько условий при левом внешнем соединении. Я хочу сгенерировать приведенный ниже запрос, используя пружинную спецификацию jpa data.

Выберите us.ALL_COLUMN, adr.ALL_COLUMN из пользователя us us left external join Address adr on us.id = adr.id и adr .effect_end_date = null , где us.id = 1

Ответы [ 2 ]

0 голосов
/ 02 марта 2020
public static Specification<A> findAbyBname(String input) {
        return new Specification<A>() {
            @Override
            public Predicate toPredicate(Root<A> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
                cq.distinct(true);
                Join<A,AB> AjoinAB = root.joinList(A_.AB_LIST,JoinType.LEFT);
                Join<AB,B> ABjoinB = AjoinAB.join(AB_.B,JoinType.LEFT);
                return cb.equal(ABjoinB.get(B_.NAME),input);
            }
        };
    }

У меня есть что-то вроде этого. Вот сущности:

@Entity
public class A {
    @Id
    private Long id;
    private String name;
    @OneToMany(mappedBy = "a")
    private List<AB> abList;
}
@Entity
public class B {
    @Id
    private Long id;
    private String name;
    @OneToMany(mappedBy = "b")
    private List<AB> abList;
}
@Entity
public class AB {
    @Id
    private Long id;
    private String name;
    @ManyToOne
    @JoinColumn(name = "a_id")
    private A a;
    @ManyToOne
    @JoinColumn(name = "b_id")
    private B b;
}
0 голосов
/ 31 января 2020

Ниже, как мы можем сделать, у нас должно быть два предиката, а затем и для этих двух perdicate, не проверено

public static Specification<Item> findByCustomer(User user) {
        return (root, criteriaQuery, criteriaBuilder) -> {
           root.fetch(User_.address, JoinType.LEFT);
    Predicate predicateForEndDate
      = criteriaBuilder.equal(root.get(User_.end_date), null);
    Predicate predicateForUser
      = criteriaBuilder.equal(root.get(User_.id), 1);

            return criteriaBuilder.and(predicateForEndDate, predicateForUser)
        };
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...