java - Hibernate:按内部列表的值过滤实体的结果列表

标签 java hibernate jpa multi-tenant

我正在尝试实现 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 列表中具有相应 zoneValueStudents。在当前的实现中,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/

相关文章:

java - 将 FetchType 更改为 LAZY 后,未发现空 beans 错误的序列化程序

java - EntityManager..getResultList() 中的 ArrayIndexOutOfBoundsException

java - 无法在 Hibernate 中保存多对多关系

java - 我们怎样才能在运行时编译和调试用Java编写的代码呢?

java - 在同一事务中 hibernate 插入忽略

java - 如何将 Java 应用程序捆绑到 Mac OS X *.app bundle ?

java - 如何使用netbeans将javadb或hsqldb嵌入到带有hibernate的java应用程序中?

java.lang.IllegalArgumentException : Named query not found.(实体管理器未创建 NamedQuery)

java - 如何拒绝Java构造函数中的不合格参数?

java - Android - Canvas onDraw 具有跟随角色移动的缩放相机