Ограничение глубокой вложенной коллекции Hibernate не работает

У меня довольно большая и беспорядочная структура данных анкеты, что привело к долгому HQL

select s from Session s join s.questionnaire q join q.categories c join c.questions q2 join q2.answers a where a.session.id=:id2 and s.id=:id

Я думаю, что этот HQL выглядит разумно, и полученный sql тоже

select session0_.id as id1_9_, session0_.name as name2_9_, session0_.position as position3_9_, session0_.questionnaire as question4_9_ from session session0_ inner join questionnaire questionna1_ on session0_.questionnaire=questionna1_.id inner join category categories2_ on questionna1_.id=categories2_.parent_questionnaire inner join question questions3_ on categories2_.id=questions3_.parent_category inner join answer answers4_ on questions3_.id=answers4_.question where answers4_.session=? and session0_.id=?

... даже если он довольно большой

Но почему-то полностью игнорирует ограничение answer. При проверке отладчика я вижу 4 разных ответа для 4 разных сеансов. Как это возможно?

Редактировать

Хорошо, это действительно интересно ...

select s from Session s join s.questionnaire q join q.categories c where c.name=:name and s.id=:id

это также не работает, и категории не фильтруются, поэтому я предполагаю, что сопоставление между сеансом и анкетой неверно?

@Entity
@Table(name = "session")
@Cacheable
@org.hibernate.annotations.Cache(region = "session", usage = CacheConcurrencyStrategy.READ_WRITE)
public class Session implements Serializable {
    @Id
    @Column(name = "id")
    private String id;
    @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
    @JoinColumn(name = "questionnaire")
    @LazyCollection(LazyCollectionOption.FALSE)
    private Questionnaire questionnaire;
}

@Entity
@Table(name = "questionnaire")
@Cacheable
@org.hibernate.annotations.Cache(region = "questionnaire", usage = CacheConcurrencyStrategy.READ_WRITE)
public class Questionnaire implements Serializable {
    @Id
    @Column(name = "id")
    private String id;
}

... изменение на это не работает

select q from Questionnaire q join q.categories c where c.name=:name

так что я полностью потерялся

При проверке отладчика я вижу 4 разных ответа для 4 разных сеансов. и что в этом плохого? Каков ожидаемый результат?
Antoniossss 04.09.2018 10:45

Поскольку я проверяю where a.session.id=:id2, я предположил, что все полученные ответы будут иметь один и тот же набор сеансов. И в этом случае я ожидаю ровно один ответ

munHunger 04.09.2018 10:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
65
0

Другие вопросы по теме