Spring Data JPA encontrar por objeto incrustado propiedad

Quiero escribir un Spring Data JPA interfaz del repositorio de firma de método que me permitirá encontrar entidades con una propiedad de un objeto incrustado en esa entidad. ¿Alguien sabe si esto es posible, y si es 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 que este usando la Primavera de Datos?

  • No findByBookIdRegion(Region region, Pageable pageable) hacer el truco?
  • Sí, que lo hace. No pude encontrar la documentación para que en cualquier lugar. Se oculta o implícita en algún lugar que yo no vea?
  • La ha convertido en una respuesta y se ha añadido un enlace a la sección pertinente de la referencia docs.
InformationsquelleAutor CorayThan | 2014-06-26

4 Kommentare

  1. 131

    Este nombre del método debe hacer el truco:

    Page<QueuedBook> findByBookIdRegion(Region region, Pageable pageable);

    Más información sobre esto en la sección sobre consulta derivación de la referencia docs.

    • Lo que si tengo una lista de Integrable? o elemento de colección?
    • Si queremos findBy consulta con 3 preperty entonces, ¿qué será de la sintaxis? es como findByPro1AndPro2AndPro3?
  2. 8

    Si usted está usando BookId como un combinado de clave principal, a continuación, recuerde cambiar su interfaz de:

    public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {

    a:

    public interface QueuedBookRepo extends JpaRepository<QueuedBook, BookId> {

    Y cambiar la anotación @Incorporado a @EmbeddedId, en su QueuedBook clase como esta:

    public class QueuedBook implements Serializable {
    
    @EmbeddedId
    @NotNull
    private BookId bookId;
    
    ...
  3. 0

    De acuerdo, para mí, la Primavera no manejar todos los casos con facilidad. En su caso
    el siguiente debe hacer el truco

    Page<QueuedBook> findByBookIdRegion(Region region, Pageable pageable);  

    o

    Page<QueuedBook> findByBookId_Region(Region region, Pageable pageable);

    Sin embargo, depende también de la convención de nomenclatura de los campos que usted tiene en su @Embeddable clase,

    por ejemplo, el siguiente campo puede no funcionar en cualquiera de los estilos mencionados anteriormente

    private String cRcdDel;

    He probado con los dos casos (como sigue) y no funcionó (parece que la Primavera no maneja este tipo de convenciones de nombres(es decir, para muchas Tapas , sobre todo al principio – 2ª carta (no estoy seguro de si este es el único caso, aunque)

    Page<QueuedBook> findByBookIdCRcdDel(String cRcdDel, Pageable pageable); 

    o

    Page<QueuedBook> findByBookIdCRcdDel(String cRcdDel, Pageable pageable);

    Cuando he cambiado el nombre de la columna a

    private String rcdDel;

    mis siguientes soluciones funcionan bien sin ningún problema:

    Page<QueuedBook> findByBookIdRcdDel(String rcdDel, Pageable pageable); 

    O

    Page<QueuedBook> findByBookIdRcdDel(String rcdDel, Pageable pageable);

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea