我正在尝试实施多租户。 目前,我有以下实体:
@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抛出了无法确定这种类型的异常。
答案 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"));