У меня есть объекты, подобные приведенным ниже;
@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);
};
}
Как я могу сделать это с помощью спецификации?кто-нибудь может мне помочь?