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?
Dieser Methodenname sollte den Trick machen:
Page<QueuedBook> findByBookIdRegion(Region region, Pageable pageable);
Weitere Informationen dazu finden Sie im Abschnitt über Abfragenableitung der Referenzdokumente.
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);
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;
...
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);