【问题标题】:Hibernate: Filter result list of entities by values of inner listHibernate:按内部列表的值过滤实体的结果列表
【发布时间】:2019-05-04 18:11:32
【问题描述】:

我正在尝试实现多租户。 目前我有以下实体:

@Data
@Entity
public class Zone {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "[NAME]")
    private String name;
}    

还有Student实体:

@Data
@Entity
@Table(name = "[Student]")
@FilterDef(name = "zoneFilter", parameters = {@ParamDef(name = "zoneValue", type = "string")})
@Filter(name = "zoneFilter", condition = "zones.zone_id = :zoneValue")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "FIRST_NAME")
    private String firstName;

    @Column(name = "AGE")
    private Integer age;

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
    @JoinTable(name = "student_zone", joinColumns = @JoinColumn(name = "student_id"),
            inverseJoinColumns = @JoinColumn(name = "zone_id"))
    private List<Zone> zones;
}   

所以,我想只得到Studentszones 列表中有对应的zoneValue。使用当前实现 Hibernate 生成以下查询:

select student0_.id as id1_0_, student0_.age as age2_0_, student0_.first_name as first_na3_0_, student0_.tenant_id as tenant_i4_0_ from [student] student0_ where zones.zone_id = ?

所以,它会抛出无法绑定zones.zone_id 的异常。 那么,我如何按区域的值过滤学生?是否可以通过使用休眠过滤器来做到这一点?

可能,我必须在FilterDef 中输入正确的类型,但是当我写Zone 时,Hibernate 会抛出无法确定此类类型的异常。

【问题讨论】:

    标签: java hibernate jpa multi-tenant


    【解决方案1】:

    你有没有尝试添加

    @FilterJoinTable(name="zoneFilter", condition=":zoneValue = zone_id")
    private List<Zone> zones;
    

    并删除

    @Filter(name = "zoneFilter", condition = "zones.zone_id = :zoneValue")
    

    (因为我认为过滤器应该在属性而不是类上)

    然后调用

    Filter filter = session.enableFilter("randomName");
    filter.setParameter("zoneFilter", new String("myZoneValue")); 
    

    为了激活过滤器?


    我认为 Hibernate 不知道 zone.value 因为您不使用别名 (http://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#pc-filter-sql-fragment-alias)

    这会给我们类似的东西:

    @Filter(
        name="zoneFilter",
        condition="{z}.zone_id = :zoneValue",
        aliases = {
            @SqlFragmentAlias( alias = "z", table= "student_zone"),
        }
    )
    

    【讨论】:

    • 这不是我想要存档的。使用您的代码,我将过滤zones 列表,但我想过滤Student
    • @iChrome 我已根据您的需要更新了我的答案 :) 希望它会起作用!
    • 不幸的是它也不起作用:(它说找不到表student_zone
    • 如果将“@SqlFragmentAlias( alias = "z", table="student_zone")" 替换为 "@SqlFragmentAlias( alias = "z", table="zone")"。也许 Hibernate 想要你的表“zone”而不是“student_zone”(这是连接表)。 (条件也应该换成 "condition="{z}.id = :zoneValue"")
    • 是的,我也试过zone 表,但它无论如何都会抛出找不到zone 表的异常。它只是不会为 Student 表抛出异常,但我只是不明白为什么我需要在 Student 实体中为 Student 表创建别名。
    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 2023-02-25
    • 2014-10-05
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 2021-12-06
    相关资源
    最近更新 更多