我正在尝试实现 Multi-Tenancy 。 目前我有以下实体:
@Data
@Entity
public class Zone {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "[NAME]")
private String name;
}
和学生
实体:
@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;
}
所以,我只想获取在 zones
列表中具有相应 zoneValue
的 Students
。在当前的实现中,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
无法绑定(bind)的异常。
那么,我如何按区域的值过滤学生呢?是否可以使用 Hibernate Filter 来做到这一点?
可能,我必须在 FilterDef
中放置正确的类型,但是当我编写 Zone
时,Hibernate 会抛出异常,它无法确定此类类型。
最佳答案
您是否尝试添加
@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"),
}
)
关于java - Hibernate:按内部列表的值过滤实体的结果列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55968586/