Создание запроса критериев гибернации для таблиц с несколькими связями - PullRequest
1 голос
/ 08 ноября 2019

У меня есть структура таблицы примерно такая ...

class A{
    Integer id;

    @OneToMany //
    List<B> b;

}

Class B{

    Integer id;

    @ManyToOne
    A a;

    @OneToMany
    List<C> c;
}

Class C{

    Integer id;

    String someField;

    @ManyToOne
    B b;

}

Теперь я хочу запросить все записи класса A, где C.someField равен переданному параметру.

Примечание: нет прямой связи A с C.

Отношения похожи на A -> Список и B -> Список , и мне нужноотметьте это во всем списке C.

Как создать запрос критерия для такой проблемы?

Ответы [ 2 ]

2 голосов
/ 11 ноября 2019

Запрос относительно вашего вопроса будет выглядеть так:

SELECT c1.name, c1.id
FROM c c1
JOIN b b1 on c1.b_id = b1.id
JOIN a a1 on b1.a_id = a1.id
WHERE a1.name = 'ABC'

все записи класса A, где C.someField равен параметру, переданному как 'ABC'

Решение:

Criteria c_criteria = getCurrentSession().createCriteria(C.class,"c1"); 
Criteria b_criteria = c_criteria.createCriteria("b","b1");
Criteria a_criteria = b_criteria.createCriteria("c","c1");
a_criteria.add(Restrictions.eq("name", "ABC"));

ProjectionList properties = Projections.projectionList();
properties.add(Projections.property("someField"));
properties.add(Projections.property("id"));

c_criteria.setProjection(properties);
c_criteria.list();
0 голосов
/ 15 ноября 2019

Я уже изменил весь свой поток реализации вместе со структурой базы данных, но если кто-то хочет реализовать подобный запрос, это можно сделать следующим образом:

Criteria criteria = getCurrentSession().createCriteria(A.class,"a");
criteria.createCriteria("a.b",b);
criteria.createCriteria("b.c",c);
criteria.add(Restrictions.eq("c.someField","queryParameter");

То, что я делал раньше, быловместо criteria.createCriteria (Criteia поверх Criteria) я использовал criteria.crateAlias (который только создает псевдоним) для списков.

Надеюсь, эта помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...