web-dev-qa-db-fra.com

Données de printemps - OR condition dans un nom de méthode de référentiel

Dans mon projet Spring Data, j'ai une entité suivante:

@Entity
@NamedEntityGraph(name = "graph.CardPair", attributeNodes = {})
@Table(name = "card_pairs")
public class CardPair extends BaseEntity implements Serializable {

    private static final long serialVersionUID = 7571004010972840728L;

    @Id
    @SequenceGenerator(name = "card_pairs_id_seq", sequenceName = "card_pairs_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "card_pairs_id_seq")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "card1_id")
    private Card card1;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "card2_id")
    private Card card2;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "selected_card_id")
    private Card selectedCard;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "board_id")
    private Board board;

....

}

J'ai besoin d'implémenter une méthode de référentiel Spring Data qui recherchera une CardPair basée sur cardPairId, board et card. Le cas le plus compliqué pour moi est une Card car je dois construire une condition dans laquelle card1 = card or card2 = card

Est-il possible de fournir cette condition via le nom de la méthode du référentiel Spring Data?

Par exemple

cardPairRepository.findByIdAndBoardAnd[card1 = card or card2 = card]AndSelectedCardIsNull(cardPairId, board, card);

Est-il possible de traduire cette condition card1 = card or card2 = card dans un nom de méthode?

11
alexanoid

Il est impossible d'y parvenir en utilisant uniquement le nom de la méthode, car la dernière condition doit être entre parenthèses: id = ? AND board = ? AND (card1 = ? OR card2 = ?). Il n'y a aucun moyen de déduire cela du nom de la méthode car il est destiné à couvrir uniquement les cas de base.

Il y a trois façons dans votre cas:

7
Alec Kravets

Vous trouverez toutes les opérations ici: http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html section 2.2.2

findByIdAndBoardAndCard1OrCard2(cardPairId, board, card, card);

Je n'ai pas testé l'ordre de ceci, mais ça devrait être quelque chose comme ça

0