2016-05-09 11 views
6

Nel mio progetto primavera dati Ho un seguenti entità:primavera dati - condizione OR in nome di un metodo repository

@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; 

.... 

} 

ho bisogno di implementare un metodo repository primavera dati che cercare un CardPair basata su cardPairId, board e card. Il caso più complicato per me è un Card perché ho bisogno di costruire una condizione in cui card1 = card or card2 = card

E 'possibile fornire questa condizione tramite il nome del metodo di deposito dati Spring Data?

Per esempio

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

E 'possibile tradurre questa condizione card1 = card or card2 = card in nome di un metodo?

+0

Siete solo in cerca di un nome di metodo qui? –

+0

Sì, non posso costruire questo nome metodo con una condizione menzionata – alexanoid

+2

Utilizzare i metodi finder solo per casi di utilizzo semplice, per casi più complessi scrivere una query e utilizzare l'annotazione '@ Query'. –

risposta

2

È impossibile ottenere ciò utilizzando solo il nome del metodo poiché è necessario che l'ultima condizione sia tra parentesi: id = ? AND board = ? AND (card1 = ? OR card2 = ?). Non c'è modo di inferire questo dal nome del metodo poiché è inteso a coprire solo i casi di base.

Ci sono tre modi nel tuo caso:

0

È possibile chiamare il metodo areCardsEqual(Card first, Card second)

Sembra che si dovrebbe dividere il vostro metodo di qui come si sta facendo un sacco di operazioni in un metodo. Le migliori pratiche indicano che ciascun metodo dovrebbe essere responsabile di un'operazione.

... oppure si può semplicemente utilizzare un @Query utilizzando HQL poiché la query è complessa

+0

No, ho bisogno di creare un repository dati Spring metodo, qualcosa del genere - findByIdAndBoardAndCard1OrCard2AndSelectedCardIsNull – alexanoid

+0

Quali sarebbero i tuoi input allora? –

+0

'cardPairId',' board' e 'card' – alexanoid

0

Potete trovare tutte le operazioni qui: http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html sezione 2.2.2

findByIdAndBoardAndCard1OrCard2(cardPairId, board, card, card); 

non ho Testen l'ordine di questo, ma dovrebbe essere qualcosa di simile

+0

non funziona - findByIdAndBoardAndCard1OrCard2 (cardPairId, currentBoard, card) con eccezione run-time. La scheda – alexanoid

+0

deve essere nei parametri due volte. –

+0

Oltre al mio ultimo commento, potrebbe non funzionare affatto a causa di parentesi che dovrebbero essere aggiunte all'istruzione OR. Ma potrebbe essere che la primavera sappia come gestirlo a causa dell'ordine. la '@ Query' suggerita da Alec è probabilmente più sicura. –

Problemi correlati