Вопрос о Criteria.createCriteria в Hibernate API - PullRequest
3 голосов
/ 21 сентября 2011

Так что я все еще пытаюсь познакомиться с API Hibernate Criteria, и у меня есть этот фрагмент кода Java, который я хотел бы получить разъяснения.

Criteria c = super.getSession().createCriteria(PpNnCtDetail.class);
c.add(Restrictions.between("commencementDate", fromDate, toDate);

Эта часть, я понимаю, чтопроисходит - если выразить это с точки зрения SQL, это будет что-то вроде - поправьте меня, если я ошибаюсь,

SELECT * FROM PpNnCtDetail WHERE commencementDate >= fromDate AND commencementDate <= toDate;

Проблема заключается в коде, следующем за двумя строками выше.

c = c.createCriteria("nnContractTbl");
c.createCriteria("progCategory").add(Restrictions.in("progCategoryId", allProgCat));
c.createCriteria("acadOrgTbl");
c.createCriteria("serviceType");
c.createCriteria("campusTbl");
return c.list();

Что пытается сделать первая строка?Это назначение обратно в c избыточно?

На самом деле, чего пытаются достичь строки c.createCriteria?Как будет выглядеть эквивалентный SQL-запрос?Что еще более важно, что вернет c.list ()?

Ответы [ 2 ]

2 голосов
/ 21 сентября 2011

Назначение на c = c.createCriteria("nnContractTbl"); является избыточным, createCriteria и почти все методы Criteria изменяют экземпляр, к которому они вызваны, и возвращают сам экземпляр для изменения метода. Таким образом, вы можете звонить по цепочке так:

return super.getSession().createCriteria(PpNnCtDetail.class)
    .add(Restrictions.between("commencementDate", fromDate, toDate)
    .createCriteria("nnContractTbl")
    .createCriteria("progCategory").add(Restrictions.in("progCategoryId", allProgCat))
    .createCriteria("acadOrgTbl")
    .createCriteria("serviceType")
    .createCriteria("campusTbl")
    .list();

А что касается результата этой последовательности, Criteria.createCriteria(association) приведет к внутреннему объединению между данными, уже имеющимися в критериях, и таблицей, созданной в ассоциации, моделируемой атрибутом association. Он также будет «корневым» (как они указываются в Javadocs) Критериями в объекте ассоциации, так что при последующих вызовах createCriteria(association), association относится к атрибуту ассоциации, объявленному в последнем «укоренившемся» объекте.

Это сокращение для Criteria.createCriteria(association, joinType) с joinType CriteriaSpecification.INNER_JOIN.

1 голос
/ 21 сентября 2011

Те createCriteria, как указано выше, в основном эквивалентны INNER JOIN для переданной сущности.

Лучший способ найти ответы на ваши вопросы (а также узнать о спящем режиме в это время) - включить ведение журнала SQL в файле конфигурации Hibernate и проверить сгенерированный SQL.

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