Hibernate: фильтрует список результатов сущностей по значениям внутреннего списка - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь реализовать мультитенантность. В настоящее время у меня есть следующие лица:

@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 не может быть связан. Итак, как я могу отфильтровать студентов по значениям зон? Возможно ли это сделать с помощью Hibernate Filter?

Возможно, мне нужно указать правильный тип в FilterDef, но когда я пишу Zone Hibernate выдает исключение, что он не может определить такой тип.

1 Ответ

0 голосов
/ 03 мая 2019

Вы пытались добавить

@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"),
    }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...