Quiero escribir una firma de método de interfaz de repositorio de Spring Data JPA que me permita encontrar entidades con una propiedad de un objeto incrustado en esa entidad. ¿Alguien sabe si esto es posible y, de ser así, cómo?
Aquí está mi 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);
}
¿Puedo escribir una consulta para esto usando Spring Data?
java
spring
jpa
spring-data
spring-data-jpa
CorayThan
fuente
fuente
findByBookIdRegion(Region region, Pageable pageable)
?Respuestas:
Este nombre de método debería funcionar:
Más información sobre eso en la sección sobre derivación de consultas de los documentos de referencia.
fuente
One findByIdAndTwoId(Long oneId, Long twoId);
y da como resultado una consulta de la forma:select ...... from one one_ left outer join two two_ on one_.two_id = two_.id where one_id = ? and two_.id = ?
Lo anterior: findByBookIdRegion () no funcionó para mí. Lo siguiente funciona con la última versión de String Data JPA:
fuente
Si está utilizando BookId como una clave primaria combinada, recuerde cambiar su interfaz de:
a:
Y cambie la anotación @Embedded a @EmbeddedId, en su clase QueuedBook así:
fuente
Según yo, Spring no maneja todos los casos con facilidad. En su caso, lo siguiente debería funcionar
o
Sin embargo, también depende de la convención de nomenclatura de los campos que tenga en su
@Embeddable
clase,Por ejemplo, es posible que el siguiente campo no funcione en ninguno de los estilos mencionados anteriormente.
Intenté con ambos casos (como sigue) y no funcionó (parece que Spring no maneja este tipo de convenciones de nomenclatura (es decir, muchas mayúsculas, especialmente al principio) - 2da letra (no estoy seguro de si esto es aunque el único caso)
o
Cuando cambié el nombre de la columna a
mis siguientes soluciones funcionan bien sin ningún problema:
O
fuente