web-dev-qa-db-fra.com

Comment utiliser @Where dans Hibernate

Recherche pendant quelques heures, mais je suis coincé dans ma courbe d'apprentissage pour PlayFramework avec JPA. Je suis en train de créer un exemple de site Web sur lequel des articles peuvent être publiés. Mais ces messages peuvent avoir les états:

  • PostDraft (l'article est un brouillon, ne pas publier)
  • PostPublished (le post peut être publié)

Ces états sont stockés dans une table séparée. De toute évidence, le projet de publication de l'état ne devrait pas encore être visible.

J'ai donc ces classes:

  • Classe de page (obtenir les informations de page à partir du tableau, 1 page peut avoir plusieurs articles)
  • Classe de messages (les messages peuvent être en brouillon et publiés)

Dans ma classe de page, j'ai:

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

Mais ça ne fonctionne pas! Alors, comment puis-je spécifier une clause where, pour ne charger que les articles qui sont à l'état publié sans utiliser JPQL ??

Merci!

MISE À JOUR: 2011-10-11

Tableau: Messages avec colonnes: - id - title - state_ref (référence à la table ID of States) - contenu

Tableau: Etats avec colonnes: - id - nom de l'état

Alors je veux dire quelque chose comme:

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

MISE À JOUR 13/10/2011

C'est ma modification actuelle, dans ma classe de page: mais cela ne fonctionne pas non plus.

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

PDATE 2012-02-1 La réponse d'Emt a fonctionné pour moi après tout.

14
adis

Essayez quelque chose comme:

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

ou

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

selon le type de champ d'état de votre entité Post.

17
emt14

La clause where doit être une condition complète - quelque chose comme ça. En supposant que cet état est une propriété sur le poste.

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

MODIFIER

Basé sur le modèle de données - ce qui suit devrait fonctionner. Je ne recommanderais pas de l'utiliser. Ne mappez pas la collection de publications - ayez simplement une référence à Page de la classe POsts, ajoutez une méthode à votre DAO pour récupérer les publications publiées pour une page en utilisant HQL ou une requête de critères.

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

La condition where doit contenir un nom de colonne de base de données:

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

Ici, le nom de la colonne state se trouve dans DB et non dans le mappage Hibernate.

0
Alex