0

共通の親から継承された複数のエンティティからの列でフィルター処理する休止状態のクエリに問題があります。

次に例を示します。

抽象的な親:

@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...
}

キャンペーン:

@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;
}

そのキャンペーンのすべてのアイテム (サービス + 製品) を返品してほしいです。

質問があります

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

現在、休止状態が行うことは、単一のサービスではなく、関連するすべての製品を返すことです。

キャンペーンに割り当てられたサービスがあります。

camp.id を指定せずにクエリを実行すると、クエリは services を返します。

誰かがこれを解決するのを助けることができますか?.

4

1 に答える 1

0

Hibernate フィルターを使用すると問題が解決します。こちらを参照してください @OneToMany 関連付けの結果をフィルター処理するに は、この注釈の質問の回答を参照してください

于 2013-04-15T08:37:48.867 に答える