Как использовать @Where в Hibernate - PullRequest
13 голосов
/ 09 октября 2011

Искал несколько часов, но я застрял в своей кривой обучения PlayFramework с JPA. Я создаю пример веб-сайта, где можно делать сообщения. Но эти посты могут иметь состояния:

  • PostDraft (опубликовать черновик, не публиковать)
  • Сообщение опубликовано (публикация может быть опубликована)

Эти состояния хранятся в отдельной таблице. Очевидно, черновик государственных постов пока не должен быть виден.

Итак, у меня есть эти классы:

  • Класс страницы (получение информации о странице из таблицы, 1 страница может иметь несколько сообщений)
  • Класс сообщений (сообщения могут быть в черновике и опубликованы)

В классе моей страницы у меня есть:

@Column(name="POSTS_REF")
@Where(clause="PostPublished")
private List<Posts> userPosts;

Но это не работает! Итак, как я могу указать предложение where, чтобы загружать только сообщения, которые находятся в опубликованном состоянии без использования JPQL ??

Спасибо!

ОБНОВЛЕНИЕ: 2011-10-11

Таблица: Посты с колонками: - Я бы - заглавие - state_ref (ссылка на таблицу идентификаторов состояний) - содержание

Таблица: Состояния со столбцами: - Я бы - имя

Итак, я хочу сказать что-то вроде:

select * 
from posts inner join states on posts.state_ref = states.id
where states.statename = 'PostPublished'

ОБНОВЛЕНИЕ 2011-10-13

Это моя текущая модификация в классе моей страницы: но она тоже не работает.

/** link to the states */
@JoinColumn(name = "STATES_REF")
@OneToOne
@Where(clause = "states.statename = 'PostPublished'")
public MyState state;

ОБНОВЛЕНИЕ 2012-02-13 В конце концов, ответ Эмта сработал для меня.

Ответы [ 3 ]

17 голосов
/ 09 октября 2011

Попробуйте что-то вроде:

@Column(name="POSTS_REF")
@Where(clause="state='PostPublished'")
private List<Posts> userPosts;

или

@Column(name="POSTS_REF")
@Where(clause="PostPublished=true")
private List<Posts> userPosts;

в зависимости от типа поля состояния вашего Post объекта.

2 голосов
/ 09 октября 2011

Предложение where должно быть полным условием - что-то вроде этого. Предполагая, что это состояние является свойством поста.

@Column(name="POSTS_REF")
@Where(clause="state = 'PostPublished'")
private List<Posts> userPosts;

EDIT

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

@Column(name="POSTS_REF")
@Where(clause="exists (select id from states where state_ref = states.id and states.statename = 'PostPublished')")
private List<Posts> userPosts;
0 голосов
/ 17 марта 2014

Условие where должно содержать имя столбца базы данных:

@Where(clause="state = 'PostPublished'")

Здесь имя столбца state находится в БД, а не в отображении Hibernate.

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