Spring Data JPA gömülü nesne özelliğine göre bulur


101

O varlıkta gömülü bir nesnenin özelliğine sahip varlıkları bulmama izin verecek bir Spring Data JPA deposu arayüz yöntemi imzası yazmak istiyorum. Bunun mümkün olup olmadığını bilen var mı ve eğer öyleyse nasıl?

İşte kodum:

@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);

}

Spring Data'yı kullanarak bunun için bir sorgu yazabilir miyim?


4
findByBookIdRegion(Region region, Pageable pageable)Hile yapmıyor mu ?
Oliver Drotbohm

2
Evet, öyle. Bunun için hiçbir yerde belge bulamadım. Gizli mi yoksa görmediğim bir yerde mi ima ediliyor?
CorayThan

Bunu bir cevaba dönüştürdü ve referans belgelerinin ilgili bölümüne bir bağlantı ekledi.
Oliver Drotbohm

Yanıtlar:


145

Bu yöntem adı hile yapmalı:

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

Referans belgelerinin sorgu türetilmesi ile ilgili bölümde bununla ilgili daha fazla bilgi .


11
Gömülebilir bir listem varsa ne olur? veya element koleksiyonu?
user962206

FindBy query with 3 preperty istiyorsak sözdizimi ne olur? findByPro1AndPro2AndPro3 gibi mi?
surendrapanday

Böyle bir sorgu her zaman bir iç birleşimle mi sonuçlanır? Ben yapıyorum One findByIdAndTwoId(Long oneId, Long twoId);formun bir sorguda ve sonuçları:select ...... from one one_ left outer join two two_ on one_.two_id = two_.id where one_id = ? and two_.id = ?
Truva


9

BookId'i birleşik birincil anahtar olarak kullanıyorsanız, arayüzünüzü şunlardan değiştirmeyi unutmayın:

public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {

to:

public interface QueuedBookRepo extends JpaRepository<QueuedBook, BookId> {

Ve QueuedBook sınıfınızda @Embedded ek açıklamasını @EmbeddedId olarak değiştirin:

public class QueuedBook implements Serializable {

@EmbeddedId
@NotNull
private BookId bookId;

...

1

Bana göre Spring tüm vakaları kolaylıkla ele almıyor. Senin durumunda aşağıdakiler hile yapmalı

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

veya

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

Ancak, @Embeddablesınıfınızdaki alanların adlandırma kuralına da bağlıdır.

Örneğin, aşağıdaki alan yukarıda belirtilen stillerin hiçbirinde çalışmayabilir

private String cRcdDel;

Her iki durumu da denedim (aşağıdaki gibi) ve işe yaramadı (Görünüşe göre Spring bu tür adlandırma kurallarını uygulamıyor (yani birçok Büyük Harfe, özellikle başlangıçta - 2. harf (bunun olup olmadığından emin değilim) tek durum olsa da)

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

veya

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

Sütunu olarak yeniden adlandırdığımda

private String rcdDel;

Aşağıdaki çözümlerim sorunsuz çalışıyor:

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

VEYA

Page<QueuedBook> findByBookIdRcdDel(String rcdDel, Pageable pageable);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.