【问题标题】:Hibernate query for super class only仅针对超类的休眠查询
【发布时间】:2014-07-31 10:19:30
【问题描述】:

我扩展了新实体 Auditor 的域模型,它从实体 User 扩展而来。用户是已经存在的旧实体(数据库表)。现在,如果对超类用户(仅)执行一些查询,Hibernate 也会在审计表上附加左外连接子句。有人知道如何解决吗?

用户类

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "users")
@DiscriminatorColumn(length = 10, name = "discriminator", 
    discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("user")
@SequenceGenerator(name = "users_id_seq", 
    sequenceName = "users_id_seq", 
    initialValue = 1, allocationSize =1)
public class User extends AbstractEntity implements UserDetails{

    private static final long serialVersionUID = 198524L;

    private Long id;
    // ...
}

审核员类

@Entity
@Table(name = "auditor")
@DiscriminatorValue("auditor")
public class Auditor extends User {

    private Country countery;
    // ...
}

用户列表的 HQL 查询示例

Query query = sessionFactory.getCurrentSession()
    .createQuery("select type(u) from User u");

return Collections.checkedList(query.list(), User.class);

Hibernate 生成器,例如:

 select
        case 
            when user0_1_.id is not null then 1 
            when user0_.id is not null then 0 
        end as col_0_0_ 
    from
        users user0_ 
    left outer join
            auditor user0_1_ 
            on user0_.id=user0_1_.id 
  group by
        user0_.id 
order by

【问题讨论】:

  • 这似乎与my question有关。你是怎么解决这个问题的?

标签: sql hibernate hql


【解决方案1】:

这是JOINED 继承类型的缺点,您不能禁用此功能。 有两种解决方法:
1)使用TABLE_PER_CLASS继承类型

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class User extends AbstractEntity implements UserDetails {  

2) 使用@MappedSuperclass 代替@Inheritance

@MappedSuperclass
public class User extends AbstractEntity implements UserDetails {

【讨论】:

  • 我曾经尝试过 TABLE_PER_CLASS,但在审计表上没有左外连接,而是 union all。我也集成了@DiscriminatorColumn,但是生成的SQL是一样的。
  • 如果您执行select u from Users u 之类的操作,您的结果列表中是否包含审核员和用户?
  • 两者都没有,只有用户属性。但问题是,Hibernate 总是附加左外连接子句。这是复杂查询中的问题,在哪里使用 group by 子句。另一方面,这也是不必要的开销。
  • @PeterJurkovič 你试过@MappedSuperclass吗?
猜你喜欢
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多