Критерии гибернации OneToMany, ManyToOne и List - PullRequest
0 голосов
/ 20 января 2010

У меня есть три объекта ClassA, ClassB и ClassC.

ClassA {
 ...
 @Id
 @GeneratedValue
 @Column(name = "a_id")
 private long id;
 ...
 @OneToMany(cascade={CascadeType.ALL})
 @JoinColumn(name="a_id")
 private List<ClassB> bbb;
 ...
}

ClassB {
 ...
 @ManyToOne
 private ClassC ccc;
 ...
}

ClassC {
 ...
 private String name;
 ...
}

Я хочу отфильтровать по критериям спящего режима ClassA по «имени» члена ClassC.Таким образом, я хочу получить по критерию гибернации список объектов ClassA, которые имеют внутри объектов ClassC с указанным именем.Проблема в том, что доступ к объектам ClassC осуществляется через список ClassB.

Я пробовал что-то подобное, но это не работает:

crit.createCriteria("bbb").createCriteria("ccc").add(Restrictions.ilike("name", name, MatchMode.ANYWHERE));

Буду благодарен за помощь.

Ответы [ 2 ]

2 голосов
/ 22 января 2010

Вам необходимо использовать псевдонимы для вложения ограничений:

criteria.createAlias("bbb", "bbb", CriteriaSpecification.LEFT_JOIN);
criteria.createAlias("bbb_ccc", "bbb.ccc", CriteriaSpecification.LEFT_JOIN);
criteria.add(Restrictions.ilike("bbb_ccc.name", name, MatchMode.ANYWHERE));

Это отфильтрует результаты по сущности aaa, но фактически не извлечет связанные сущности (bbb и ccc).Чтобы получить эти объекты, проще всего установить для параметра аннотации сопоставления значение FetchMode.EAGER.Но вы также можете сделать это динамически в коде для каждого запроса.

1 голос
/ 08 апреля 2016

как CriteriaSpecification.LEFT_JOIN устарела, поэтому вы можете использовать org.hibernate.sql.JoinType.LEFT_OUTER_JOIN

criteria.createAlias("bbb", "bbb", JoinType.LEFT_OUTER_JOIN); criteria.createAlias("bbb_ccc", "bbb.ccc", JoinType.LEFT_OUTER_JOIN); criteria.add(Restrictions.ilike("bbb_ccc.name", name, MatchMode.ANYWHERE));

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