2014-06-10 42 views
2

我擴展了實體用戶的實體Auditor擴展域模型。用戶是已經存在的舊實體(數據庫表)。現在,如果爲超級用戶(僅)執行一些查詢,Hibernate也會在審計員表上附加左外部聯接子句。有沒有人有一個想法如何解決它?只有超級類的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); 

休眠generats例如爲:

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 

回答

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 { 
+0

我曾經試過TABLE_PER_CLASS,但不是左外連接有UNION ALL在審計員桌上。我也集成了@DiscriminatorColumn,但生成的SQL是相同的。 –

+0

如果您做了類似'從用戶那裏選擇您'的東西,您是否會在您的結果列表中同時獲得審覈員和用戶? – carbontax

+0

兩者都不,只有用戶屬性。但問題是,Hibernate總是附加左外部連接子句。這是複雜查詢中的問題,其中使用了group by子句。另一方面,這也是不必要的開銷。 –