2010-11-03 3 views
2

J'ai deux classes qui partagent un UUID et sont mappées unidirectionnellement. J'utilise le UUID aux lignes liées au groupe, et ce groupe partage beaucoup de détails (ce qui est juste un exemple):Hibernate Criteria Rejoindre le problème

@Entity @Table 
class Something { 
    @Id @Column("something_id") 
    private Long id; 

    private String uuid = UUID.randomUUID().toString(); 

    @OneToMany 
    @JoinColumn("uuid") 
    private List<Detail> details = new LinkedList<Detail>(); 
} 

@Entity @Table 
class Detail { 
    @Id @Column("detail_id") 
    private Long id; 
    private String value; 
    private String uuid; 
} 

Je tente d'utiliser des critères:

Criteria c = getSession().createCriteria(Something.class).createAlias("details", "detail").add(Restrictions.eq("detail.value", someValue)); 

Tout cela est bien et dandy, mais je ne suis pas d'obtenir des résultats en raison de la jointure:

inner join DETAIL d1_ on this_.SOMETHING_ID=d1_.UUID 

Est-il possible de préciser:

inner join DETAIL d1 on this_.UUID=d1.UUID 

Je m'attendais à ce que la jointure utilise l'annotation @JoinColumn pour trouver la colonne à rejoindre. Je vois que je peux spécifier un type de jointure, mais je ne vois pas un moyen de spécifier la colonne réelle.

Répondre

1

Je m'attendais à ce que la jointure utilise l'annotation @JoinColumn pour trouver la colonne à rejoindre. Je vois que je peux spécifier un type de jointure, mais je ne vois pas un moyen de spécifier la colonne réelle.

La jointure est en utilisant l'annotation JoinColumn car il est de rejoindre le d1_.UUID. Toutefois, étant donné que vous n'avez pas spécifié l'élément referencedColumnName, la clé étrangère est supposée se référer à la clé primaire de la table référencée (this_.SOMETHING_ID), d'où le résultat obtenu.

En d'autres termes, essayez ceci:

@OneToMany 
@JoinColumn(name="uuid", referencedColumnName="uuid") 
private List<Detail> details = new LinkedList<Detail>(); 

Je ne suis pas sûr de comprendre l'avantage, mais disons que c'est une autre histoire.