休眠:通过内部列表的值过滤实体的结果列表

时间:2019-05-03 11:08:44

标签: java hibernate jpa multi-tenant

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

@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;
}   

因此,我只想获取Students列表中具有相应zoneValue的那个zones。在当前的实现中,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抛出了无法确定这种类型的异常。

1 个答案:

答案 0 :(得分:0)

您是否尝试添加

opkg

然后删除

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

(因为我认为过滤器应该位于属性而非类上)

然后打电话

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

要启用过滤器?


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

这将为我们提供类似的信息:

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