@Entity
@Table
public class SomeEntity {
@Id
private Long someId;
@Column
private String text;
@ManyToMany
@JoinTable(name = "map", joinColumns = @JoinColumn(name = "someId"), inverseJoinColumns = @JoinColumn(name = "eventId"))
private Set<SomeEntityEvent> events;
// get/set
}
和
@Entity
@Table
public class SomeEntityEvent {
@Id
private Long eventId;
@Column
private Calendar date;
// get/set
}
Hibernate會產生如下表(請注意,我沒有對地圖實體)
some_entity: someId | text some_entity_event: eventId | date map: someId | eventId
我想使用Criteria
API來獲取屬於某個SomeEntity
的所有SomeEntityEvent
實例,該實例按日期排序並在某個範圍內。通過SQL,我可以簡單地做
SELECT *
FROM some_entity_event e
NATURAL JOIN map
WHERE map.someId = [ my field ]
ORDER BY e.date DESC
LIMIT 0, 100;
由於我沒有Map
實體(或SomeEntity
參考),我不知道如何建立一個Criteria
等效於上面的查詢。下面的標準讓我全部SomeEntityEvent
。我只想要那些屬於SomeEntity
的那些。
Criteria criteria = getCurrentSession().createCriteria(SomeEntityEvent.class);
criteria.addOrder(Order.desc("date"))
.setFirstResult(firstResult)
.setMaxResults(maxResults);
return criteria.list();
這可能與Criteria
?如果是的話,你如何執行該加入?
我想我要結束添加雙向關聯。我原本不是因爲我不希望用戶能夠關注該關聯。我在查看其他問題,除了最後將「ResultTransformer」設置爲「DistinctRootEntityResultTransformer.INSTANCE」之外,您還可以提供相同的答案。那是什麼? –
另外,在第一個HQL選項中,'join'是否像「自然連接」一樣執行,只映射相等的ID? –
它避免了在結果中多次發生相同的事件。它與HQL中的「select distinct」基本相同。你可能確實需要這個。忘了它。 –