Подтвердить что ты не робот

Spring Данные JPA найти по встроенному объекту

Я хочу написать сигнатуру метода интерфейса репозитория данных JPA Spring, которая позволит мне найти объекты с свойством внедренного объекта в этом объекте. Кто-нибудь знает, возможно ли это, и если да, то как?

Здесь мой код:

@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?

4b9b3361

Ответ 1

Это имя метода должно выполнить трюк:

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

Подробнее об этом в разделе вывод запроса справочных документов.

Ответ 2

Вышеуказанный - findByBookIdRegion() не работал у меня. Ниже приведена последняя версия String Data JPA:

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

Ответ 3

Если вы используете BookId в качестве комбинированного первичного ключа, не забудьте изменить свой интерфейс с:

public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {

чтобы:

public interface QueuedBookRepo extends JpaRepository<QueuedBook, BookId> {

И измените аннотацию @Embedded на @EmbeddedId в своем классе QueuedBook следующим образом:

public class QueuedBook implements Serializable {

@EmbeddedId
@NotNull
private BookId bookId;

...

Ответ 4

По моему мнению, Spring не справляется со всеми делами с легкостью. В вашем случае следующее должно сделать трюк

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

или же

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

Однако это также зависит от соглашения об именах полей, которые есть в вашем классе @Embeddable,

например, следующее поле может не работать ни в одном из стилей, упомянутых выше

private String cRcdDel;

Я попытался в обоих случаях (как показано ниже), и это не сработало (кажется, что Spring не обрабатывает соглашения об именах такого типа (т.е. для многих заглавных букв, особенно в начале - 2-я буква (не уверен, что это так). единственный случай, хотя)

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

или же

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

Когда я переименовал столбец в

private String rcdDel;

мои следующие решения работают нормально без каких-либо проблем:

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

ИЛИ ЖЕ

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