anotação para filtrar resultados de uma associação @OneToMany

Tenho relacionamento pai / filho entre duas tabelas e o mapeamento correspondente em minhas classs Java. As tabelas são mais ou menos assim:

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

e o código 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; } 

Isso funciona bem, mas eu gostaria de adicionar um filtro nas linhas que eu recupero da tabela filho. A consulta gerada é semelhante a:

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

E eu gostaria que fosse:

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

O filtro adicional seria apenas um nome de coluna e um valor codificado. Existe uma maneira de fazer isso usando annotations de hibernação?

Eu olhei para @JoinFormula , mas com isso eu sempre tenho que fazer referência a um nome de coluna da tabela pai (no atributo name do JoinFormula).

Agradecemos antecipadamente por qualquer conselho.

Não é suportado pelo JPA, mas se você estiver usando o hibernate como provedor JPA, poderá usar a anotação @FilterDef e @Filter .

Documentação de referência principal do Hibernate

O Hibernate3 tem a capacidade de pré-definir critérios de filtragem e append esses filtros tanto em nível de class quanto em nível de coleção. Um critério de filtro permite que você defina uma cláusula de restrição semelhante ao atributo “where” existente disponível na class e vários elementos de coleção. Essas condições de filtro, no entanto, podem ser parametrizadas. O aplicativo pode decidir em tempo de execução se determinados filtros devem ser habilitados e quais devem ser seus valores de parâmetro. Os filtros podem ser usados ​​como visualizações de database, mas são parametrizados dentro do aplicativo.

Exemplo

 @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 

com o JPA 1, você pode usar a solução fornecida, mas alterar desembrulhar para getDelegate para ser assim

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

e vai funcionar.

Se eu estou entendendo a pergunta certa, há uma maneira de fazer isso com annotations javax.persistence (eu usei isso em um ManyToOne eu mesmo, e adaptei a resposta daqui ):

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

Observe as aspas simples no referencedColumnName, esse é o valor que você está procurando.

Mais informações aqui .

Intereting Posts