2012-08-31 2 views
0

Я пытаюсь перевести простой API HQL в Criteria API, может ли кто-нибудь мне помочь? Это мой HQL:Hibernate HQL к критериям

SELECT ch FROM Parent p JOIN p.childeren ch WHERE p.id = :id

В результате я получаю детей. Важно, что от ребенка до родителя нет никакого отношения. Существует только отношение в Родитель детям, как это:

 
@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL }) 
@JoinColumn(name="parent_id") 
private List children; 

Как я могу получить те же результаты, используя критерии-API?

+0

Отношения с ребенком до родителей? Покажите нам свои карты, пожалуйста. –

+0

Оригинальная проблема не о детях и родителях. Я изменил его, чтобы сделать мой вопрос более ясным. –

ответ

1

только выборку ассоциированного объектом является огромной болью, используя критерии API. Вам потребуются подзапросы:

DetachedCriteria subCriteria = DetachedCriteria.forClass(Parent.class); 
    subCriteria.createCriteria("children", "c"); 
    subCriteria.setProjection(Projections.property("c.id")); 
    subCriteria.add(Restrictions.eq("id", 1)); 
    // Assuming Children is the name of the class 
    Criteria criteria = sess.createCriteria(Children.class); 
    criteria.add(Subqueries.propertyIn("id", subCriteria)); 
    criteria.list(); 
0

Возможное решение этой проблемы - использовать sqlRestriction, как в примере ниже, но это не приятно, потому что для этого требуется использовать имя столбца базы данных.

Criteria crit = sessionFactory.getCurrentSession().createCriteria(Child.class); crit.add(Restrictions.sqlRestriction("{alias}.parent_id = ?", parentId, LongType.INSTANCE));

ли кто-то есть лучшее решение?

0

Вам не нужен запрос для этого, потому что вы можете сделать:

Set<Child> children = session.get(Parent.class, id).getChildren(); 
children.size(); // trigger lazy initialization 
+0

Вопрос был «Как перевести HQL в Criteria-API?» Ваше решение не относится к API критериев. –

Смежные вопросы