首页 > 解决方案 > 多对一映射上的休眠过滤器

问题描述

@FilterDef(name = CommonConstants.PRODUCT_FILTER, parameters = {@ParamDef(name="products", type = "long")})
@Filter(name = CommonConstants.PRODUCT_FILTER, condition = "alert.product in (:products)")
@NoArgsConstructor
@SuperBuilder
public class AlertNotificationUserJpaEntity extends AbstractJpaEntity {
    @Column(name = "USER_ID")
    private Long user;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "ALERT_ID")
    private AlertJpaEntity alert;
}



@FilterDef(name = CommonConstants.PRODUCT_FILTER, parameters = {@ParamDef(name="products", type = "long")})
@Filter(name =  CommonConstants.PRODUCT_FILTER, condition = "PRODUCT_ID in (:products)")
@Table(name = "alert")
@NoArgsConstructor
@SuperBuilder
public class AlertJpaEntity extends AbstractJpaEntity {

    private static final long serialVersionUID = 1L;

    @Column(name = "PARENT")
    private Long parent;

    @Column(name = "PRODUCT_ID")
    private Long product;

    @Column(name = "SUBPRODUCT_ID")
    private Long subProduct;
}

当我运行声明性方法 findByUser(Long userId) 时,它会抛出错误说 alert.product 不存在

有什么办法可以取

就像是

select alertNotif from AlertNotificationUserJpaEntity alertNotif inner join AlertJpaEntity alert on alertNotif.alert.id = alert.id where alert.product in (:product)

标签: hibernatespring-data-jpahibernate-sessionhibernate-filters

解决方案


你不能只使用这样的查询吗?

@Query("from AlertNotificationUserJpaEntity alertNotif where alertNotif.alert.product in :products")
public findAllByProduct(@Param("product") List<Long> products);

推荐阅读