2013-04-15 21 views
0

我有一个问题,休眠查询,该过滤从多个实体从共同父母继承的列。hibernate的父子查询,不过滤儿童的FK

这里是例子:

抽象父:

@Entity 
@Inheritance (strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class AItem 
{ 
     /** The id. */ 
     @Id 
     @Column (name = "pk_id") 
     private Long id; 

     /** The date of creational. */ 
     @Column (name = "c_date_created", nullable = true, columnDefinition = "timestamp with time zone") 
     private Calendar dateCreated; 

     /** The date of change. */ 
     @Column (name = "c_date_changed", nullable = true, columnDefinition = "timestamp with time zone") 
     private Calendar dateChanged; 

     /** Name of item. */ 
     @Column (name = "c_name", nullable = false) 
     private String name; 


     /** type of item. */ 
     @Column (name = "c_type", nullable = false) 
     @Enumerated (EnumType.STRING) 
     EItemType type; 
} 

孩子:

@Entity 
@Table (name = "t_product", schema = "am") 
public class CProduct extends AItem 
{ 

     @ManyToMany (fetch = FetchType.LAZY, mappedBy = "products") 
     private Set<CCampaign> campaigns; 

    ...some more attributes... 
} 
@Entity 
@Table (name = "t_service", schema = "am") 
public class CService extends AItem 
{ 

     @ManyToMany (fetch = FetchType.LAZY, mappedBy = "services") 
     private Set<CCampaign> campaigns; 

    ...some more attributes... 
} 

ccampaign:

@Entity 
@Table (name = "t_campaign", schema = "am") 
public class CCampaign 
{ 
     /** The id. */ 
     @Id 
     @SequenceGenerator (name = "T_CAMPAIGN_PKID_GENERATOR", sequenceName = "AM.T_CAMPAIGN_PK_ID_SEQ") 
     @GeneratedValue (strategy = GenerationType.AUTO, generator = "T_CAMPAIGN_PKID_GENERATOR") 
     @Column (name = "pk_id") 
     private Long id; 

     /** 
     * Products available in the campaign. 
     */ 
     @ManyToMany (fetch = FetchType.EAGER, cascade = {CascadeType.REFRESH, CascadeType.MERGE}) 
     @JoinTable (name = "t_x_campaign_product", schema = "am", joinColumns = {@JoinColumn (name = "pk_campaign", nullable = false, updatable = false)}, inverseJoinColumns = {@JoinColumn (name = "pk_item", nullable = false, updatable = false)}) 
     private Set<CProduct> products; 

     /** 
     * services available in the campaign. 
     */ 
     @ManyToMany (fetch = FetchType.EAGER, cascade = {CascadeType.REFRESH, CascadeType.MERGE}) 
     @JoinTable (name = "t_x_campaign_service", schema = "am", joinColumns = {@JoinColumn (name = "pk_campaign", nullable = false, updatable = false)}, inverseJoinColumns = {@JoinColumn (name = "pk_item", nullable = false, updatable = false)}) 
     private Set<CService> services; 
} 

我想所有(服务+产品)返回为那个活动GN。

我有查询

select distinct item from AItem item left join item.campaigns camp where camp.id = 5

什么现在休眠所做的就是返回所有相关产品,而不是单一的服务。

有活动分配的服务。

当我运行查询没有指定camp.id然后查询将返回服务。

可以帮助解决这个问题吗?

回答