SpringDataJPA 通过嵌入式对象属性查找

我想编写一个 Spring Data JPA 存储库接口方法签名,它可以让我在实体中找到具有嵌入对象属性的实体。有人知道这是否可能,如果可能又是如何做到的吗?

Here's my 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);


}

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

143280 次浏览

This method name should do the trick:

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

在参考文档的 查询派生部分有更多关于这方面的信息。

以上的 findByBookIdArea ()对我来说不起作用:

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

如果您使用 BookId 作为组合主键,那么请记住将接口改为:

public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {

致:

public interface QueuedBookRepo extends JpaRepository<QueuedBook, BookId> {

然后在 QueuedBook 类中将注释“嵌入”更改为“ EmbeddedId”,如下所示:

public class QueuedBook implements Serializable {


@EmbeddedId
@NotNull
private BookId bookId;


...

据我所知,Spring 并不能轻松处理所有的案子 the following should do the trick

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

or

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

当我将 column 重命名为

private String rcdDel;

我的以下解决方案没有任何问题:

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

或者

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