Eu quero escrever uma assinatura de método de interface de repositório Spring Data JPA que me permitirá encontrar entidades com uma propriedade de um objeto incorporado nessa entidade. Alguém sabe se isso é possível e se sim como?
Este é o meu código:
@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);
}
Posso escrever uma consulta para isso usando Spring Data?
java
spring
jpa
spring-data
spring-data-jpa
CorayThan
fonte
fonte
findByBookIdRegion(Region region, Pageable pageable)
faz o truque?Respostas:
Este nome de método deve fazer o truque:
Mais informações sobre isso na seção sobre derivação de consulta dos documentos de referência.
fonte
One findByIdAndTwoId(Long oneId, Long twoId);
e resulta em uma consulta do formulário:select ...... from one one_ left outer join two two_ on one_.two_id = two_.id where one_id = ? and two_.id = ?
O acima - findByBookIdRegion () não funcionou para mim. O seguinte funciona com a versão mais recente do String Data JPA:
fonte
Se você estiver usando BookId como uma chave primária combinada, lembre-se de alterar sua interface de:
para:
E altere a anotação @Embedded para @EmbeddedId, em sua classe QueuedBook assim:
fonte
Na minha opinião, o Spring não lida com todos os casos com facilidade. No seu caso, o seguinte deve resolver
ou
No entanto, também depende da convenção de nomenclatura dos campos que você tem em seu
@Embeddable
classe,por exemplo, o campo a seguir pode não funcionar em nenhum dos estilos mencionados acima
Eu tentei com ambos os casos (como segue) e não funcionou (parece que o Spring não lida com este tipo de convenções de nomenclatura (ou seja, para muitos Caps, especialmente no início - 2ª letra (não tenho certeza se este é embora o único caso)
ou
Quando eu renomei a coluna para
minhas seguintes soluções funcionam bem sem qualquer problema:
OU
fonte