wake-up-neo.com

Spring Data JPA-Suche nach eingebetteter Objekteigenschaft

Ich möchte eine Signatur für die Spring Data JPA-Repository-Schnittstellenmethode schreiben, mit der ich Entitäten mit einer Eigenschaft eines eingebetteten Objekts in dieser Entität finden kann. Weiß jemand, ob und wie dies möglich ist?

Hier ist mein 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);

}

Kann ich dazu mit Spring Data eine Abfrage schreiben?

89
CorayThan

Dieser Methodenname sollte den Trick machen:

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

Weitere Informationen dazu finden Sie im Abschnitt über Abfragenableitung der Referenzdokumente.

128
Oliver Drotbohm

Die obige - findByBookIdRegion () hat bei mir nicht funktioniert. Folgendes funktioniert mit der neuesten Version von String Data JPA:

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

Wenn Sie BookId als kombinierten Primärschlüssel verwenden, ändern Sie Ihre Benutzeroberfläche von:

public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {

zu:

public interface QueuedBookRepo extends JpaRepository<QueuedBook, BookId> {

Ändern Sie die Annotation @Embedded in @EmbeddedId in Ihrer QueuedBook-Klasse wie folgt:

public class QueuedBook implements Serializable {

@EmbeddedId
@NotNull
private BookId bookId;

...
8
Tim Kara

Meiner Meinung nach behandelt Spring nicht alle Fälle mit Leichtigkeit. In Ihrem Fall sollte das Folgende den Trick tun

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

oder

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

Dies hängt jedoch auch von der Namenskonvention der Felder in Ihrer Klasse @Embeddable Ab.

z.B. Das folgende Feld funktioniert möglicherweise in keinem der oben genannten Stile

private String cRcdDel;

Ich habe es mit beiden Fällen versucht (wie folgt) und es hat nicht funktioniert (es scheint, dass Spring diese Art von Namenskonventionen nicht handhabt (dh zu viele Großbuchstaben, insbesondere am Anfang - 2. Buchstabe) (nicht sicher, ob dies der Fall ist) der einzige Fall aber)

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

oder

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

Als ich die Spalte in umbenannt habe

private String rcdDel;

meine folgenden Lösungen funktionieren problemlos:

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

OR

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