2010-11-03 4 views
2

У меня есть 2 класса, которые делят UUID и отображаются однонаправленно. Я использую UUID рядам связанных групп, и эта группа имеет много общих деталей (это просто пример):Критерий Hibernate Присоединиться к проблеме

@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; 
} 

Я пытаюсь использовать критерии:

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

Это все хорошо и денди, но я не получаю результаты из-за объединения:

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

можно указать:

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

Я бы ожидал, что соединение будет использовать annotaiton @JoinColumn, чтобы найти столбец для соединения. Я вижу, что я могу указать тип соединения, но я не вижу способа указать фактический столбец.

ответ

1

Я бы ожидал, что соединение будет использовать аннотацию @JoinColumn, чтобы найти столбец для соединения. Я вижу, что я могу указать тип соединения, но я не вижу способа указать фактический столбец.

Джойн является с помощью JoinColumn аннотацию, так как это присоединение на d1_.UUID. Однако, поскольку вы не указали элемент referencedColumnName, предполагается, что внешний ключ ссылается на первичный ключ ссылочной таблицы (this_.SOMETHING_ID), следовательно, полученный результат.

Другими словами, попробуйте следующее:

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

Я не уверен, чтобы понять выгоду, но давайте говорить, что это другая история.

Смежные вопросы