Dữ liệu mùa xuân JPA tìm theo thuộc tính đối tượng nhúng


101

Tôi muốn viết chữ ký phương pháp giao diện kho lưu trữ dữ liệu mùa xuân JPA sẽ cho phép tôi tìm các thực thể có thuộc tính của một đối tượng được nhúng trong thực thể đó. Có ai biết nếu điều này là có thể, và nếu vậy làm thế nào?

Đây là mã của tôi:

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

}

Tôi có thể viết một truy vấn cho điều này bằng cách sử dụng Dữ liệu mùa xuân không?


4
Không findByBookIdRegion(Region region, Pageable pageable)thực hiện thủ thuật?
Oliver Drotbohm

2
Đúng vậy. Tôi không thể tìm thấy tài liệu cho điều đó ở bất cứ đâu. Nó được che giấu hay ngụ ý ở đâu đó mà tôi không thấy?
CorayThan

Biến điều đó thành câu trả lời và thêm liên kết đến phần liên quan của tài liệu tham khảo.
Oliver Drotbohm

Câu trả lời:


145

Tên phương thức này sẽ thực hiện thủ thuật:

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

Thông tin thêm về điều đó trong phần về dẫn xuất truy vấn của các tài liệu tham khảo.


11
Điều gì sẽ xảy ra nếu tôi có một danh sách có thể nhúng? hay tập hợp phần tử?
user962206 17/02/16

Nếu chúng ta muốn truy vấn findBy với 3 preperty thì cú pháp sẽ là gì? nó giống như findByPro1AndPro2AndPro3?
surendrapanday

Một truy vấn như vậy luôn dẫn đến một liên kết bên trong? Tôi đang thực hiện One findByIdAndTwoId(Long oneId, Long twoId);và kết quả là một truy vấn có dạng:select ...... from one one_ left outer join two two_ on one_.two_id = two_.id where one_id = ? and two_.id = ?
TroJaN


9

Nếu bạn đang sử dụng BookId làm khóa chính kết hợp, thì hãy nhớ thay đổi giao diện của bạn từ:

public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {

đến:

public interface QueuedBookRepo extends JpaRepository<QueuedBook, BookId> {

Và thay đổi chú thích @Embedded thành @EmbeddedId, trong lớp QueuedBook của bạn như thế này:

public class QueuedBook implements Serializable {

@EmbeddedId
@NotNull
private BookId bookId;

...

1

Theo tôi, Spring không giải quyết tất cả các trường hợp một cách dễ dàng. Trong trường hợp của bạn, những điều sau sẽ thực hiện thủ thuật

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

hoặc là

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

Tuy nhiên, nó cũng phụ thuộc vào quy ước đặt tên của các trường mà bạn có trong @Embeddablelớp của mình ,

ví dụ: trường sau có thể không hoạt động trong bất kỳ kiểu nào đã đề cập ở trên

private String cRcdDel;

Tôi đã thử với cả hai trường hợp (như sau) và nó không hoạt động (có vẻ như Spring không xử lý loại quy ước đặt tên này (nghĩa là đối với nhiều Caps, đặc biệt là ở đầu - chữ cái thứ 2 (không chắc về điều này có trường hợp duy nhất mặc dù)

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

hoặc là

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

Khi tôi đổi tên cột thành

private String rcdDel;

các giải pháp sau của tôi hoạt động tốt mà không có bất kỳ vấn đề nào:

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

HOẶC LÀ

Page<QueuedBook> findByBookIdRcdDel(String rcdDel, Pageable pageable);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.