Cómo usar @Where en Hibernate

Busqué por unas horas, pero estoy atrapado en una curva de aprendizaje para PlayFramework con JPA. Estoy construyendo un sitio web de muestra donde se pueden hacer publicaciones. Pero estas publicaciones pueden tener los estados:

  • PostDraft (la publicación es un borrador, no se publica)
  • PostPublished (publicación puede ser publicada)

Estos estados se almacenan en una tabla separada. Obviamente, los borradores de las publicaciones estatales no deberían estar visibles aún.

Entonces tengo estas clases:

  • Clase de página (obteniendo la información de la página de la tabla, 1 página puede tener múltiples publicaciones)
  • Clase de publicaciones (las publicaciones pueden estar en borrador y publicadas)

En mi clase de página tengo:

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

¡Pero esto no está funcionando! Entonces, ¿cómo puedo especificar una cláusula where para cargar solo las publicaciones que están en estado publicado sin usar JPQL?

¡Gracias!

ACTUALIZACIÓN: 2011-10-11

Tabla: Publicaciones con columnas: – id – title – state_ref (referencia a la tabla ID de estados) – content

Tabla: Estados con columnas: – id – statename

Entonces quiero decir algo como:

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

ACTUALIZAR 2011-10-13

Esta es mi modificación actual, en mi clase de página: pero tampoco funciona.

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

ACTUALIZACIÓN 2012-02-13 La respuesta de Emt funcionó para mí después de todo.

Pruebe algo como:

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

o

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

dependiendo del tipo de campo de estado en tu entidad Post .

La cláusula where debe ser una condición completa, algo como esto. Suponiendo que el estado es una propiedad en la publicación.

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

EDITAR

Basado en el modelo de datos, lo siguiente debería funcionar. No recomendaría usarlo. No asigne la colección de publicaciones: solo haga referencia a la página de la clase POsts, agregue un método a su DAO para recuperar las publicaciones publicadas para una página mediante HQL o consulta de criterios.

 @Column(name="POSTS_REF") @Where(clause="exists (select id from states where state_ref = states.id and states.statename = 'PostPublished')") private List userPosts; 

La condición where debe contener un nombre de columna de base de datos:

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

Aquí, el nombre de columna de state está en DB y no en el mapeo de Hibernate.