annotation pour filtrer les résultats d’une association @OneToMany

J’ai une relation parent / enfant entre deux tables et le mappage correspondant dans mes classes Java. Les tableaux ressemblent grosso modo à ceci:

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 bs; } @Entity class B { @Id @Column(name = "A_REF") private int aRef; @Id @Column(name = "OTHER") private int other; } 

Cela fonctionne bien, mais j’aimerais append un filtre sur les lignes que je récupère de la table enfant. La requête générée ressemble à ceci:

 select a_ref, other, foo from B where a_ref = ? 

Et j’aimerais que ce soit:

 select a_ref, other, foo from B where a_ref = ? and other = 123 

Le filtre supplémentaire serait uniquement un nom de colonne et une valeur codée en dur. Y a-t-il un moyen de faire cela en utilisant des annotations en veille prolongée?

J’ai consulté @JoinFormula , mais avec cela, je dois toujours référencer un nom de colonne à partir de la table parent (dans l’atsortingbut name de JoinFormula).

Merci d’avance pour tout conseil.

Il n’est pas pris en charge par JPA, mais si vous utilisez hibernate en tant que fournisseur JPA, vous pouvez utiliser les annotations @FilterDef et @Filter .

Documentation de référence Hibernate Core

Hibernate3 a la capacité de prédéfinir des critères de filtre et de les attacher au niveau de la classe et de la collection. Un critère de filtre vous permet de définir une clause de ressortingction similaire à l’atsortingbut “where” existant disponible sur la classe et divers éléments de collection. Ces conditions de filtre peuvent toutefois être paramétrées. L’application peut ensuite décider au moment de l’exécution si certains filtres doivent être activés et quelles doivent être les valeurs de leurs parameters. Les filtres peuvent être utilisés comme des vues de firebase database, mais ils sont paramétrés dans l’application.

Exemple

 @Entity public class A implements Serializable{ @Id @Column(name = "REF") private int ref; @OneToMany @JoinColumn(name = "A_REF", referencedColumnName = "REF") @Filter(name="test") private Set bs; } @Entity @FilterDef(name="test", defaultCondition="other = 123") public class B implements Serializable{ @Id @Column(name = "A_REF") private int aRef; @Id @Column(name = "OTHER") private int other; } Session session = entityManager.unwrap(Session.class); session.enableFilter("test"); A a = entityManager.find(A.class, new Integer(0)) a.getb().size() //Only contains b that are equals to 123 

avec JPA 1, vous pouvez utiliser la solution fournie mais changer de dérouler pour que getDelegate soit comme ça

 Session session = (Session)entityManager.getDelegate(); 

et ça va marcher.

Si je comprends bien la question, il existe un moyen de le faire avec des annotations javax.persistence (je l’ai utilisé moi-même sur ManyToOne et j’ai adapté la réponse à partir de là ):

 @JoinColumns({ @JoinColumn(name = "A_REF", referencedColumnName = "REF"), @JoinColumn(name = "B_TABLE_NAME.OTHER", referencedColumnName = "'123'")}) @OneToMany private Set bs; 

Notez les guillemets simples dans la propriété referenceColumnName, il s’agit de la valeur que vous recherchez.

Plus d’informations ici .