java hibernate jpa jointable

java - @jointable spring



anotaciĆ³n para filtrar los resultados de una asociaciĆ³n @OneToMany (3)

JPA no lo admite, pero si utiliza hibernación como proveedor de JPA, puede usar la anotación @FilterDef y @Filter .

Hibernate Core Reference Documentation

Hibernate3 tiene la capacidad de predefinir criterios de filtro y adjuntar esos filtros tanto a nivel de clase como a nivel de colección. Un criterio de filtro le permite definir una cláusula de restricción similar al atributo "where" existente en la clase y varios elementos de colección. Estas condiciones de filtro, sin embargo, pueden ser parametrizadas. La aplicación puede entonces decidir en tiempo de ejecución si ciertos filtros deberían estar habilitados y cuáles deberían ser sus valores de parámetros. Los filtros se pueden usar como vistas de base de datos, pero están parametrizados dentro de la aplicación.

Ejemplo

@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<B> 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

Tengo una relación padre / hijo entre dos tablas y la asignación correspondiente en mis clases de Java. Las mesas aproximadamente se ven así:

A (ref number, stuff varchar2(4000)) B (a_ref number, other number, foo varchar2(200))

y el código de 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; }

Esto funciona bien, pero me gustaría agregar un filtro en las filas que recupero de la tabla secundaria. La consulta que se genera se ve así:

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

Y me gustaría que fuera:

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

El filtro adicional sería solo un nombre de columna y un valor codificado. ¿Hay alguna manera de hacer eso usando las anotaciones de hibernación?

He mirado en @JoinFormula , pero con eso siempre tengo que hacer referencia a un nombre de columna de la tabla principal (en el atributo de name de JoinFormula).

Gracias de antemano por cualquier consejo.


Si estoy entendiendo bien la pregunta, hay una manera de hacer esto con las anotaciones de persistencia javax (usé esto en un ManyToOne yo mismo, y adapté la respuesta desde here ):

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

Tenga en cuenta las comillas simples en el referencedColumnName, este es el valor que está buscando.

Más información here .


con JPA 1 puede usar la solución provista pero cambiar el desenvolvimiento para que getDelegate sea así

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

y va a funcionar.