Spring Data JPA与相关实体的示例查询

3

我似乎无法添加与相关实体匹配的QueryByExample探针。

@Entity
@Data
public class ArtistEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String description;
    @ManyToMany(fetch = FetchType.EAGER)
    private Set<GenreEntity> genreList = new HashSet<>();
    @Version
    private Long version;
}

@Entity
@Data
public class GenreEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    @Version
    private Long version;
}

@Repository
public interface ArtistRepository extends JpaRepository<ArtistEntity, Long> {
}

当我尝试以下查询时,根据Hibernate的日志,我的探针没有对Genre运行任何条件。
GenreEntity genreEntity = new GenreEntity();
genreEntity.setName("Heavy Metal");

ArtistEntity artistEntity = new ArtistEntity();

Set<GenreEntity> genreEntitySet = new HashSet<>();
genreEntitySet.add(genreEntity);

artistEntity.setGenreList(genreEntitySet);

Example<ArtistEntity> example = Example.of(artistEntity);
Pageable pagination = PageRequest.of(0, 10);
artistRepository.findAll(example, pagination);

我也尝试查看Spring Data JPA文档中有关QBE的内容,但没有找到明确提及此限制的内容,这让我认为这是一个意外的行为。

问题不清楚,你想执行什么类型的查询?而且我在ArtistEntity中没有注意到任何GenreList - Mahmoud Odeh
@MahmoudOdeh 抱歉。我已经在示例中添加了缺失的关系,同时ArtistEntity是我正在查询的实体。我在示例中有一个Repository,并且正在使用一个example进行repository.findAll操作,就像示例中一样。 - Heatmanofurioso
2个回答

6

目前,您无法使用Query By Example实现此操作。

Spring文档指出,这仅适用于SingularAttribute

目前,只有SingularAttribute属性可用于属性匹配。 https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example.running

您想要搜索一个Set<GenreEntity> (genreList)属性,它是一个PluralAttribute。不可能通过此字段进行搜索。

在构建查询时,它将被忽略,如下所示:https://github.com/spring-projects/spring-data-jpa/blob/master/src/main/java/org/springframework/data/jpa/convert/QueryByExamplePredicateBuilder.java#L127

您可以使用Specification

高级Spring Data JPA - 规范和Querydsl。https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/ 为此,您需要从接口JpaSpecificationExecutor进行扩展:
public interface ArtistRepository extends 
    JpaRepository<ArtistEntity>, JpaSpecificationExecutor<ArtistEntity> {}
  • 你还需要实现自定义的 Specification<T>
  • 然后你就可以使用 findAll(Specification<T> spec, Pageable pageable)

谢谢。我看到了关于规范的提及,但不知何故,我没有找到提及限制的帖子,所以我试图通过示例来解决问题。 - Heatmanofurioso

0

您可以使用此库,它支持嵌套字段等功能:https://github.com/turkraft/spring-filter

它将让您运行以下搜索查询:

/search?filter= 平均(评级) > 4.5 品牌名 ('audi', 'land rover') (年份 > 2018 或者 公里数 < 50000) 颜色: '白色' 没有事故


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接