给出2个表
@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将生成以下表格(注意我没有Map的实体)
some_entity: someId | text some_entity_event: eventId | date map: someId | eventId
我想使用Criteria
API来获取属于按日期排序并在某个范围内的某个SomeEntityEvent
的所有SomeEntity
个实例。使用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
这可能吗?如果是,您如何进行加入?
答案 0 :(得分:2)
首先,从HQL开始。当必须基于一组...标准动态组合查询时,标准很有用。即使您绝对想要使用条件API,也可以使用HQL查询并对其进行翻译。
好的,所以你想要属于按日期和某个范围内排序的某个SomeEntity的事件:
select event from SomeEntity entity
join entity.events event
where entity.id = :entityId
and event.date between :startDate and :endDate
order by event.date
现在您可以将其翻译为条件。问题是标准API不允许选择除根实体之外的任何其他实体,并且因为您没有从SomeEntityEvent到SomeEntity的关联,所以您被卡住了。
我的建议是:在HQL中执行,或使关联双向。如果它是双向的,您可以像这样编写HQL查询:
select event from SomeEntityEvent event
join event.entities entity
where entity.id = :entityId
and event.date between :startDate and :endDate
order by event.date
它可以很容易地转换为标准:
Criteria c = session.createCriteria(SomeEntityEvent.class, "event");
c.createAlias("event.entities", "entity");
c.add(Restrictions.eq("entity.id", entityId);
c.add(Restrictions.between("event.date", startDate, endDate);
c.addOrder("event.date");
请注意HQL查询的每个部分如何直接转换为类似的条件指令。