Использование функций базы данных для преобразования столбцов в критерии гибернации - PullRequest
5 голосов
/ 15 октября 2011

Несмотря на 3 часа поиска и поиска в API, я не могу найти никаких ссылок на то, возможно ли использовать функции базы данных в запросе критериев гибернации. Чтобы быть конкретным:

Я хотел бы получить доступ к части даты datetime в базе данных postgres и группировать по ней. Я думаю, что запрос будет выглядеть примерно так:

session.createCriteria(Exam.class)
  .setProjection(Projections.projectionList()
    .add(Projections.property("DATE(beginExam)").as("beginDate"))
    .add(Projections.groupProperty("beginDate")))
  .list();

Это не работает, предоставляя мне исключение "не удалось разрешить свойство: Date (beginExam) ...". Кажется, что это очень простая вещь, и я должен что-то упустить. Учитывая, что я также строю ограничения динамически (я оставил это в примере), кажется, что критерии - это спящий компонент, который нужно использовать для этого, но я открыт для любых предложений на данный момент, за исключением того, чтобы обойти весь вопрос создав свою собственную группу.

Спасибо

Ответы [ 2 ]

9 голосов
/ 15 октября 2011

Вы пробовали Projection.sqlProjection как этот

session.createCriteria(Exam.class)
  .setProjection(Projections.projectionList()
  .add(Projections.sqlProjection("date(beginExam) as beginDate", new String[] { "beginDate" }, new Type[] { StandardBasicTypes.DATE }))
  .add(Projections.groupProperty("beginDate")))
.list();

или Projection.sqlGroupProjection как этот

session.createCriteria(Exam.class)
  .setProjection(Projections.sqlGroupProjection("date(beginExam) as beginDate", "beginDate", new String[] { "beginDate" }, new Type[] { StandardBasicTypes.DATE }))
.list();

Hibernate генерирует псевдонимы таблиц в запросах SQL, поэтомувам может потребоваться добавить фрагмент {alias} к фрагменту SQL, чтобы эта работа работала:

session.createCriteria(Exam.class)
  .setProjection(Projections.projectionList()
  .add(Projections.sqlProjection("date({alias}.beginExam) as beginDate", new String[] { "beginDate" }, new Type[] { StandardBasicTypes.DATE }))
  .add(Projections.groupProperty("beginDate")))
.list();

или SQLGroupProjection:

session.createCriteria(Exam.class)
  .setProjection(Projections.sqlGroupProjection("date({alias}.beginExam) as beginDate", "beginDate", new String[] { "beginDate" }, new Type[] { StandardBasicTypes.DATE }))
.list();
1 голос
/ 15 октября 2011

Взгляните на Projection.sqlProjection и Portations.sqlGroupProjection

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