hibernate "JOIN ... ON"?

标签 hibernate

我有一个使用 Hibernate 作为其域对象的应用程序。应用程序的一部分在几个应用程序之间是通用的,并且它不了解其他系统。为了处理关系,我们的类看起来像这样:

@Entity
public class SystemEvent {
   @Id @GeneratedValue
   public int entity_id;

   @Column(name="event_type")
   public String eventType;

   @Column(name="related_id")
   public int relatedObjectId;
}

latedObjectId 持有多个不同对象之一的外键,具体取决于事件的类型。当系统想要了解与其兴趣相关的事件时,它会获取事件类型为“NewAccounts”或类似内容的所有系统事件,并且它知道所有这些 relatedObjectId 都是“User”对象或类似对象的 ID。

不幸的是,这导致了一个问题。我无法找到一种方法来告诉 Hibernate 有关此映射的信息,这意味着 HQL 查询无法执行连接。我真的很想创建一个如下所示的 HQL 查询:

SELECT users FROM SystemEvent event join Users newUsers where event.eventType = 'SignUp'

但是,Hibernate 不知道 SystemEvent 和 Users 之间的关系,据我所知,没有办法告诉它。

所以这是我的问题:当您的域对象通过 ID 号而不是类引用相互引用时,有什么方法可以告诉 Hibernate 有关关系吗?

最佳答案

首先,当您有一个名称类似于“eventType”的列时,您正在谈论的是鉴别器列。

其次,ORM 提供的许多功能/便利是与业务对象而不是数据库交互的能力。

我会看一下 Inheritance Chapter在 Hibernate 文档中。

如果可以的话,我会设置一个名为 SystemEvent 的抽象类,从上面的示例来看,它只有 和 ID。每个具体实现将包含“相关对象”的特定字段/属性。对于这种类型的场景,我通常使用“每个类一个表”或“每个子类一个表”映射。

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class SystemEvent {
   @Id @GeneratedValue
   public int eventId;
}

@Entity
@PrimaryKeyJoinColumn(name="event_id")
public class SignupEvent extends SystemEvent {
   @Column(name="user_id")
   public User user;
}

@Entity
@PrimaryKeyJoinColumn(name="event_id")
public class OtherEvent extends SystemEvent {
   @Column(name="other_id")
   public OtherAssociatedObject otherAssociatedObject;
}

您可以将 HQL 修改为如下所示:

SELECT users FROM SignupEvent event join Users newUsers

如果您希望我澄清此答案的任何部分,请告诉我。

关于 hibernate "JOIN ... ON"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2489318/

相关文章:

java - 在公式标签中创建别名时出错

java - "Write operations are not allowed in read-only mode"错误 : confused with Spring @Service @transaction @Repository and Hibernate

java - 如何在@query符号中添加查询条件,这可能吗?

java - 为什么即使事务已提交,EntityManager 也会关闭?

java - 将数字 (22,21) 映射到 BigDecimal 时,Hibernate 在结果中丢失精度

c# - NHibernate(Fluent NHibernate)中的多对多关系在数据库中创建意外记录

java - 仅当确切实体不存在时才保存实体

java - session.update 未在数据库中更新

java - PostUpdateListener 中的 ConcurrentModificationException

java - 如何在子查询(hql)中选择多列