2016-05-09 10 views
6

In meinem Spring Data Projekt Ich habe eine folgende Einheit:Spring Data - OR-Bedingung in einem Repository Methodennamen

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

.... 

} 

Ich brauche ein Spring Data Repository Verfahren zu implementieren, die für ein CardPair basierend auf cardPairId aussehen wird, board und card. Der kompliziertere Fall für mich ist ein Card, weil ich eine Bedingung, wo card1 = card or card2 = card

erstellen muss, ist es möglich, diese Bedingung über Spring Data Repository Methodenname bereitstellen?

Zum Beispiel

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

Ist es möglich, diese Bedingung card1 = card or card2 = card in einem Methodennamen zu übersetzen?

+0

Sind Sie gerade auf der Suche nach ein Methodenname hier? –

+0

Ja, ich kann diesen Methodennamen nicht mit einer erwähnten Bedingung erstellen – alexanoid

+2

Verwenden Sie die Finder-Methoden nur für einfache Anwendungsfälle, für komplexere Fälle schreiben Sie eine Abfrage und verwenden Sie die '@ Query'-Annotation. –

Antwort

2

Es ist unmöglich, dies nur mit Methodenname zu erreichen, da Sie die letzte Bedingung in Klammern benötigen: id = ? AND board = ? AND (card1 = ? OR card2 = ?). Es gibt keine Möglichkeit, dies aus dem Methodennamen abzuleiten, da nur grundlegende Fälle behandelt werden sollen.

Es gibt drei Möglichkeiten in Ihrem Fall:

0

können Sie rufen die Methode areCardsEqual(Card first, Card second)

Es sieht aus wie Sie Ihre Methode hier gespalten sollten Sie viele Operationen in einem Verfahren tun. Best Practices weisen darauf hin, dass jede Methode für eine Operation verantwortlich sein sollte.

... oder sonst können Sie nur eine @Query mit HQL, da Ihre Abfrage verwenden ist komplex

+0

Nein, ich muss ein Spring Data Repository erstellen Methode, etwas wie das - findByIdAndBoardAndCard1OrCard2AndSelectedCardIsNull – alexanoid

+0

Was wären Ihre Eingaben dann? –

+0

'cardPairId',' board' und 'card' – alexanoid

0

Sie alle Operationen finden Sie hier: http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html Abschnitt 2.2.2

findByIdAndBoardAndCard1OrCard2(cardPairId, board, card, card); 

Ich habe nicht TESTEN Die Reihenfolge davon, aber es sollte so etwas sein

+0

es funktioniert nicht - findByIdAndBoardAndCard1OrCard2 (cardPairId, currentBoard, Karte) mit Laufzeitausnahme. – alexanoid

+0

Karte muss zweimal in den Parametern enthalten sein. –

+0

Neben meinem letzten Kommentar, könnte es aufgrund von Klammern, die der OR-Anweisung hinzugefügt werden sollten, überhaupt nicht funktionieren. Es kann aber sein, dass der Frühling aufgrund der Ordnung damit umgehen kann. Der '@ Query'-Vorschlag von Alec ist wahrscheinlich sicherer. –

Verwandte Themen