Спецификация jpa данных весны выбрать связанные 3 таблицы - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть объекты, подобные приведенным ниже;

@Entity
public class Customer {

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

    private String name;

    @OneToMany(mappedBy = "customer", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<Card> cards;
}

  @Entity
public class Card {

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

    @Enumerated(EnumType.STRING)
    private CardType type;

    @ManyToOne
    private Customer customer;

    @OneToMany(mappedBy = "card", cascade = CascadeType.ALL)
    private List<Product> products;
}

@Entity
public class Product {

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

    private String name;
    private Integer count;

    @ManyToOne(fetch = FetchType.LAZY)
    private Card card;
}

public enum CardType {
    SPECIAL, STANDART
}

Я пытаюсь получить клиентов, у которых естьПродукты в их карточке специального типа.

Пример данных;

клиенты

+----+--------+
| id |  name  |
+----+--------+
|  1 | mike   |
|  2 | john   |
|  3 | robert |
|  4 | sam    |
+----+--------+

карты

+----+----------+-------------+
| id |   type   | customer_id |
+----+----------+-------------+
|  1 | SPECIAL  |           1 |
|  2 | SPECIAL  |           2 |
|  3 | SPECIAL  |           3 |
|  4 | STANDART |           4 |
+----+----------+-------------+

продукты

+----+----------+---------+
| id |   name   | card_id |
+----+----------+---------+
|  1 | product1 |       1 |
|  2 | product2 |       2 |
|  3 | product3 |       2 |
|  4 | product4 |       4 |
+----+----------+---------+

Результатом запроса должны быть клиенты с именами "mike" и "john", потому что в их специальных карточках есть продукты.

Я пробовал приведенный ниже код, но это не такработает:

 public static Specification<Customer> hasSpecialProduct() {
        return (root, query, cb) -> {
            Join<Customer, Card> customerCardJoin = root.join(Customer_.cards, JoinType.INNER);
            Predicate cardTypeSpecialPredicate = cb.equal(customerCardJoin.get(Card_.type), CardType.SPECIAL);
            Predicate existsProductsPredicate= cb.exists(customerCardJoin.get(Card_.products));
            return cb.and(cardTypeSpecialPredicate, existsProductsPredicate);
        };
    }

Как я могу сделать это с помощью спецификации?кто-нибудь может мне помочь?

...