Критерии гибернации - PullRequest
       10

Критерии гибернации

2 голосов
/ 03 ноября 2010

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

@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

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

1 Ответ

1 голос
/ 03 ноября 2010

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

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

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

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

Я не уверен, что понимаю выгоду, но скажем, это другая история.

...