Printemps de Données OU d'une condition dans un dépôt du nom de la méthode
Dans mon Ressort des Données de projet, 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 de mettre en œuvre un Printemps référentiel de Données de la méthode qui va chercher une CardPair
basé sur cardPairId
, board
et card
. Le cas plus compliqué pour moi, c'est un Card
parce que j'ai besoin de construire un état où card1 = card or card2 = card
Est-il possible de fournir cette condition par le Printemps référentiel de Données nom de la méthode ?
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 ?
Vous êtes à la recherche d'un nom de méthode ici?
Oui, je ne peux pas construire ce nom de la méthode avec une condition
Utilisez le finder méthodes que pour des cas d'utilisation simples, pour complexer les cas écrire une requête et de l'utilisation de la
Je suggère fortement d'écrire la requête, vous-même en utilisant HPQL..
Merci! J'ai mis en œuvre requête JPQL et maintenant tout fonctionne très bien.
Oui, je ne peux pas construire ce nom de la méthode avec une condition
Utilisez le finder méthodes que pour des cas d'utilisation simples, pour complexer les cas écrire une requête et de l'utilisation de la
@Query
annotation.Je suggère fortement d'écrire la requête, vous-même en utilisant HPQL..
Merci! J'ai mis en œuvre requête JPQL et maintenant tout fonctionne très bien.
@Query(value = "SELECT cp FROM CardPair cp WHERE id = :cardPairId AND board = :board AND card1 = :card OR card2 = :card AND selectedCard is null")
OriginalL'auteur alexanoid | 2016-05-09
Vous devez vous connecter pour publier un commentaire.
Il est impossible de réaliser cela en utilisant simplement le nom de la méthode, car vous avez besoin de la dernière condition d'ê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 les cas de base seulement.Il y a trois façons dans votre cas:
OriginalL'auteur Alec Kravets
Vous pouvez trouver 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
Je n'ai pas testen l'ordre de cette, mais il devrait être quelque chose comme ceci
la carte doit être dans les paramètres de deux fois.
D'ailleurs mon dernier commentaire, il pourrait ne pas fonctionner du tout en raison des parenthèses qui doit être ajouté à la OU de la déclaration. Mais peut-être que le printemps ne sait comment gérer ce dû à l'ordre. le
@Query
suggèrent par Alec est probablement plus sûr.OriginalL'auteur Roel Strolenberg