Spring Data JPA通过嵌入对象属性查找

Cor*_*han 91 java spring jpa spring-data spring-data-jpa

我想编写一个Spring Data JPA存储库接口方法签名,它可以让我找到在该实体中具有嵌入对象属性的实体.有谁知道这是否可能,如果是这样的话怎么样?

这是我的代码:

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

}
Run Code Online (Sandbox Code Playgroud)

我可以使用Spring Data为此编写查询吗?

Oli*_*ohm 131

这个方法名称应该可以解决问题:

Page<QueuedBook> findByBookIdRegion(Region region, Pageable pageable);
Run Code Online (Sandbox Code Playgroud)

有关参考文档的查询派生部分的更多信息.

  • 如果我有一个Embeddable列表怎么办?或元素集合? (10认同)

小智 40

上面的 - findByBookIdRegion()对我不起作用.以下适用于最新版本的String Data JPA:

Page<QueuedBook> findByBookId_Region(Region region, Pageable pageable);
Run Code Online (Sandbox Code Playgroud)

  • 截至http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-property-expressions讨论你的情况可能与歧义 (2认同)

Tim*_*ara 8

如果您使用BookId作为组合主键,请记住更改您的界面:

public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {
Run Code Online (Sandbox Code Playgroud)

至:

public interface QueuedBookRepo extends JpaRepository<QueuedBook, BookId> {
Run Code Online (Sandbox Code Playgroud)

并在QueuedBook类中将注释@Embedded更改为@EmbeddedId,如下所示:

public class QueuedBook implements Serializable {

@EmbeddedId
@NotNull
private BookId bookId;

...
Run Code Online (Sandbox Code Playgroud)