java - Hibernate 标准 - 加入未映射的实体

标签 java hibernate criteria-api

给定 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 获取属于特定 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实现吗?如果是,您如何执行该连接?

最佳答案

首先,从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 查询的每个部分如何直接转换为类似的条件指令。

关于java - Hibernate 标准 - 加入未映射的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17434192/

相关文章:

hibernate - Zookeeper适合对象缓存吗?

java - 了解项目中的工作流程

java - 如何使用 JPA Criteria API/Hibernate 按 Case 语句分组

java - java中的正则表达式?我被困住了

java - UML。如何说明外部库的用法?

java - 如何在 Struts2 中使用 anchor 而不是提交按钮?

java - 排除文件目录,通过程序集插件MAVEN

java - JPA/hibernate : Map many-to-many relationship when join table has own primary key

具有巨大参数的 JPA CriteriaDelete

jpa - CriteriaBuilderliteral() 方法的用途是什么?