Je veux écrire une signature de méthode d'interface de référentiel Spring Data JPA qui me permettra de trouver des entités avec une propriété d'un objet incorporé dans cette entité. Est-ce que quelqu'un sait si cela est possible et si oui comment?
Voici mon code:
@Entity
@Table(name = "BOOK_UPDATE_QUEUE", indexes = { uniqueConstraints = @UniqueConstraint(columnNames = {
"bookId", "region" }, name = "UK01_BOOK_UPDATE_QUEUE"))
public class QueuedBook implements Serializable {
@Embedded
@NotNull
private BookId bookId;
...
}
@Embeddable
public class BookId implements Serializable {
@NotNull
@Size(min=1, max=40)
private String bookId;
@NotNull
@Enumerated(EnumType.STRING)
private Region region;
...
}
public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {
//I'd like to write a method like this, but can't figure out how to search by region,
//when region is actually a part of the embedded BookId
Page<QueuedBook> findByRegion(Region region, Pageable pageable);
}
Puis-je écrire une requête pour cela à l'aide de Spring Data?
java
spring
jpa
spring-data
spring-data-jpa
CorayThan
la source
la source
findByBookIdRegion(Region region, Pageable pageable)
fait pas l'affaire?Réponses:
Ce nom de méthode devrait faire l'affaire:
Plus d'informations à ce sujet dans la section sur la dérivation de requêtes des documents de référence.
la source
One findByIdAndTwoId(Long oneId, Long twoId);
et aboutit à une requête de la forme:select ...... from one one_ left outer join two two_ on one_.two_id = two_.id where one_id = ? and two_.id = ?
Le ci-dessus - findByBookIdRegion () n'a pas fonctionné pour moi. Ce qui suit fonctionne avec la dernière version de String Data JPA:
la source
Si vous utilisez BookId comme clé primaire combinée, n'oubliez pas de changer votre interface de:
à:
Et changez l'annotation @Embedded en @EmbeddedId, dans votre classe QueuedBook comme ceci:
la source
Selon moi, Spring ne gère pas tous les cas avec facilité. Dans votre cas, ce qui suit devrait faire l'affaire
ou
Cependant, cela dépend également de la convention de dénomination des champs que vous avez dans votre
@Embeddable
classe,Par exemple, le champ suivant peut ne pas fonctionner dans l'un des styles mentionnés ci-dessus
J'ai essayé avec les deux cas (comme suit) et cela n'a pas fonctionné (il semble que Spring ne gère pas ce type de conventions de dénomination (c'est-à-dire à de nombreux Caps, en particulier au début - 2ème lettre (je ne sais pas si c'est le seul cas cependant)
ou
Quand j'ai renommé la colonne en
mes solutions suivantes fonctionnent bien sans aucun problème:
OU
la source