annotation de filtrer les résultats d'une @OneToMany association
J'ai des parent/enfant, la relation entre les deux tables, et le correspondant de la cartographie dans mes classes Java. Les tables à peu près ressembler à ça:
A (ref number, stuff varchar2(4000))
B (a_ref number, other number, foo varchar2(200))
et le code Java:
@Entity
class A {
@Id
@Column(name = "REF")
private int ref;
@OneToMany
@JoinColumn(name = "A_REF", referencedName = "REF")
private Set<B> bs;
}
@Entity
class B {
@Id
@Column(name = "A_REF")
private int aRef;
@Id
@Column(name = "OTHER")
private int other;
}
Cela fonctionne bien, mais je voudrais ajouter un filtre sur les lignes que j'ai récupérer à partir de la table enfant. La requête générée ressemble:
select a_ref, other, foo from B where a_ref = ?
Et j'aimerais qu'il soit:
select a_ref, other, foo from B where a_ref = ? and other = 123
Le filtre supplémentaire qui ne serait qu'un nom de colonne et une valeur codée en dur. Est-il un moyen de le faire en utilisant hibernate annotations?
J'ai regardé @JoinFormula
, mais avec qui j'ai toujours de faire référence à un nom de colonne de la table parent (dans le name
attribut de la JoinFormula).
Merci d'avance pour tous les conseils.
- Curieux, pourquoi ne pas simplement passer comme paramètre?
where a_ref = ? and other = ?
. La valeur transmise peut être codé en dur, si c'est ce que vous devez faire (je vous suggérons d'utiliser les propriétés configurables système si).
Vous devez vous connecter pour publier un commentaire.
Il n'est pas pris en charge par JPA mais si vous êtes en utilisant hibernate comme fournisseur JPA ensuite, vous pouvez utiliser les annotations
@FilterDef
et@Filter
.Exemple
avec JPA 1 vous pouvez utiliser la solution fournie mais le changement déballer à getDelegate à être comme ça
et il va fonctionner.
Si je suis la compréhension de la question de droit, il y a un moyen de le faire avec javax.la persistance des annotations (j'ai utilisé ça sur un ManyToOne moi-même, et adaptés à la réponse de ici):
Note le unique devis dans la referencedColumnName, c'est la valeur que vous recherchez.
Plus d'informations ici.