0

我正在寻找一种在 Specifications 方法中添加 QueryHint 的toPredicate方法。由于我只能访问Root<T>,CriteriaQuery<?>CriteriaBuilder实例,我想知道这是否可能。

我也可以设置全局默认值,以便将提示应用于全局的所有查询,但我更愿意在规范中添加它。也许休眠有一个我没有在它的 hibernate.properties 文件中发现的属性来实现这一点。

我知道我可以通过覆盖JpaSpecificationExecutors相应的方法并用 注释该方法来实现这一点@QueryHints,但是由于我必须对所有存储库都这样做,所以我宁愿不这样做,因为它有点容易出错。

提前致谢。

4

1 回答 1

0

这是可能的,但您必须在没有 Spring Data 包装器的情况下直接应用 Criteria API。这是Vlad Mihalcea 文章中的一个示例。

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
 
CriteriaQuery<Post> criteria = builder.createQuery(Post.class);
Root<Post> fromPost = criteria.from(Post.class);
 
criteria.where(
    builder.in(
        fromPost.get("id")).value(Arrays.asList(1, 2, 3)
    )
);
 
List<Post> posts = entityManager
    .createQuery(criteria)
    .setHint("hint_name", "hint_value")
    .getResultList();

如果你确实想坚持 Spring Data Specification,你可以尝试使用@QueryHints注解。

public interface RobotRepositoryRobot extends JpaRepository<Robot, Long>, JpaSpecificationExecutor<Robot> {
    @Override
    @QueryHints(
        @QueryHint(name = "hint_name", value = "hint_value")
    )
    List<Robot> findAll(Specification<Robot> spec);
}

尽管在这种情况下,提示不是动态的。

于 2022-02-21T20:13:39.150 回答