java - Hibernate @Filter 不适用于 Spring JpaRepository.findById 方法

标签 java hibernate spring-data

为了创建行级授权,我想使用 @Filter@FilterDef hibernate 注释结合 JpaRepository<T, ID> spring-data的接口(interface).假设,我们有以下实体:

@Entity
public class User {
   @Id
   private Long id;
   private String name;
    
   @ManyToOne
   private Pharmacy pharmacy;
}
    
@Entity
public class Pharmacy {
   @Id
   private Long id;
   private String name;
}
我想根据谁向服务器发送请求来创建授权。为此,我添加了 @Filter@FilterDef顶部的注释Pharmacy实体。所以,药房应该是这样的:
@Entity
@FilterDef(name = "pharmacyFilter", parameters = {@ParamDef(name = "userId", type = "long")})
@Filters({
   @Filter(name = "pharmacyFilter", condition = "id in (select user.pharmacy_id from user where user.id = :userId)")
})
public class Pharmacy {
   //...
}
我为访问数据库而创建的存储库如下所示:
@Repository
public interface PharmacyRepository extends JpaRepository<Pharmacy, Long> {
    
}
当我做 pharmacyFilter启用,一切正常,过滤器应用于所有查询。您可以看到为 repository.findAll() 生成的查询如下:
select pharmacy0_.id as id1_0_, pharmacy0_.name as name2_0_ from pharmacy pharmacy0_ where pharmacy0_.id in (select user.pharmacy_id from user where user.id = ?)
但是,当我想尝试使用 repository.findById(ID id) 时出现了问题。 .当我使用上述方法时,过滤器不会应用于最终查询,我们将在终端中看到以下 sql:
select pharmacy0_.id as id1_0_0_, pharmacy0_.name as name2_0_0_ from pharmacy pharmacy0_ where pharmacy0_.id=?
我猜这个问题是由于多次使用 id 造成的。一中 findById另一个处于过滤条件。但是当我尝试使用 session 创建查询时对象,这个问题没有发生,输出是可取的:
select pharmacy0_.id as id1_0_, pharmacy0_.name as name2_0_ from pharmacy pharmacy0_ where pharmacy0_.id in (select user.pharmacy_id from user where user.id = ?) and pharmacy0_.id=2
使用以下方法解决了问题,但是当我们使用 JpaRepository#findById 默认实现时会发生什么?
@Query(value = "from Pharmacy where id = :id")
Optional<Pharmacy> findById(Long id);
提前致谢。

最佳答案

正如 hibernate documentation 中所述:

Filters apply to entity queries, but not to direct fetching.


但在引擎盖下 repository.findById(ID id)方法调用 EntityManager.find .
所以,这是预期的行为。

关于java - Hibernate @Filter 不适用于 Spring JpaRepository.findById 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65980495/

相关文章:

java - 如何从 Spring Data Pageable 检索排序属性和方向?

java - 如何使用 Spring Data JPA 获得域驱动设计架构?

java - 将剪贴板内容与其中包含 "\n"的字符串进行比较 -Java

java - 如何分离 Hibernate 对象的持久属性

java - cvc-complex-type.2.4.c : The matching wildcard is strict, 但找不到元素 'tx:annotation- driven' 的声明

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

java - 无法让 while 循环工作,输入两次?

java - 如何使用 Selenium 在文本字段中发送数据?

Java 将显式锁与同步方法结合起来

java - 我可以在 JPA 中使用占位符值获取 SQL 查询吗