Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 仅针对超类的Hibernate查询_Sql_Hibernate_Hql - Fatal编程技术网

Sql 仅针对超类的Hibernate查询

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

我扩展了新实体审计员的域模型,它从实体用户扩展而来。用户是已存在的旧实体(数据库表)。现在,若对超级类用户执行了一些查询(仅限),Hibernate也会在auditor的表上追加left-outer-join子句。有人知道如何解决这个问题吗

用户类

@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
?这似乎与。你是如何解决这个问题的?