Spring Data JPA Method - найти родителя и с условными потомками - PullRequest
0 голосов
/ 04 марта 2020

Я сталкиваюсь с этой проблемой, пытаясь получить список родителей с отфильтрованными детьми. В моем приложении пользователи могут создавать корзины, и за каждую корзину они будут получать одну или несколько комиссионных после оплаты. Когда я пытаюсь получить тележки с соответствующими комиссиями, JPA получает мне тележки со всеми их комиссиями, если среди них есть мои пропущенные user_id.

// Cart Entity
@Entity
public class Cart {

    @Id
    private Long id;

    @OneToMany(mappedBy = "cart", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<Commission> commissions = new HashSet<>();
}

// Commission Entity
@Entity
public class Commission {

    @Id
    private Long id;

    @JsonIgnore
    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "cart_id", nullable = false)
    private Cart cart;

    @JsonIgnore
    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;
}

// Cart Repository
public interface CartRepository extends JpaRepository<Cart, Long> {

    Page<Cart> findDistinctByCommissions_User_Id(Long id, Pageable pageable);
}

В базе данных:

CART
|--------------|------------------|
|      id      |   description    |...
|--------------|------------------|
|       1      |       ....       |...
|--------------|------------------|
|       2      |       ....       |...
|--------------|------------------|
|       3      |       ....       |...
|--------------|------------------|

COMMISSIONS
|--------------|------------------|------------------|
|      id      |     cart_id      |      user_id     |...
|--------------|------------------|------------------|
|       1      |        1         |         1        |...
|--------------|------------------|------------------|
|       2      |        1         |         1        |...
|--------------|------------------|------------------|
|       3      |        1         |         1        |...
|--------------|------------------|------------------|
|       4      |        1         |         2        |...
|--------------|------------------|------------------|

То, что я звоню:

@GetMapping
Page<Cart> getByUserId(Long id, Pageable pageable) {
    return cartRepository.findDistinctByCommissions_User_Id(id, pageable); // 1
}

Что я получаю:

{
    "content":[
        {
            id: 1,
            commissions: [ { id: 1 }, { id: 2 }, { id: 3 }, { id: 4 } ]
        }
    ],
    ...
}

Что я хочу (исключая комиссию 4, которая не связана с пользователем 1):

{
    "content":[
        {
            id: 1,
            commissions: [ { id: 1 }, { id: 2 }, { id: 3 } ]
        }
    ],
    ...
}

Спасибо

...