Sql 仅针对超类的Hibernate查询
我扩展了新实体审计员的域模型,它从实体用户扩展而来。用户是已存在的旧实体(数据库表)。现在,若对超级类用户执行了一些查询(仅限),Hibernate也会在auditor的表上追加left-outer-join子句。有人知道如何解决这个问题吗 用户类Sql 仅针对超类的Hibernate查询,sql,hibernate,hql,Sql,Hibernate,Hql,我扩展了新实体审计员的域模型,它从实体用户扩展而来。用户是已存在的旧实体(数据库表)。现在,若对超级类用户执行了一些查询(仅限),Hibernate也会在auditor的表上追加left-outer-join子句。有人知道如何解决这个问题吗 用户类 @Entity @Inheritance(strategy = InheritanceType.JOINED) @Table(name = "users") @DiscriminatorColumn(length = 10, name = "disc
@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;
// ...
}
审计员类别
@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);
休眠生成,例如:
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
这是
JOINED
继承类型的缺点,您无法禁用此功能。
有两种解决方法:1) 使用
TABLE\u PER\u类
继承类型
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class User extends AbstractEntity implements UserDetails {
2) 使用而不是@继承
@MappedSuperclass
public class User extends AbstractEntity implements UserDetails {
我曾经尝试过每个类使用TABLE_,但在auditor表上并没有使用left-outer连接,而是使用了union-all。我也集成了@DiscriminatorColumn,但生成的SQL是相同的。如果您执行类似于
从用户中选择u
的操作,您的结果列表中是否同时包含审计员和用户?都没有,只有用户属性。但问题是,Hibernate总是附加左外部连接子句。这是复杂查询中的问题,其中使用GROUPBY子句。另一方面,这也是不必要的开销。@PeterJurkovič您是否尝试过@MappedSuperclass
?这似乎与。你是如何解决这个问题的?