2

いくつかの通常のフィールドと @ElementCollection (MediaCostRuleSource) で注釈が付けられた 1 つの関連付けフィールドを持つエンティティ (MediaCostRule) があります。

エンティティ フィールドのサブセットを保持し、同じ関連付けセットも含む dto (MediaCostRuleDto) もあります。

ここにクラスコードがあります

@Entity
@Table(name = "media_cost_rules")
public class MediaCostRule extends AdminEntity{

@Id
@GeneratedValue
@Column(name = "media_cost_rule_id")
private Integer id;

@Column(name = "name")
@Length(max = 100)
private String name;

@Column(name="is_enabled")
private Boolean enabled;

@ManyToOne
@JoinColumn(name = "brand_id")
private Brand brand;

@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "media_cost_rule_sources", joinColumns = @JoinColumn(name = "media_cost_rule_id"))
private Set<MediaCostRuleSource> mediaCostRuleSources = new HashSet<MediaCostRuleSource>();

================================================== ===================

@Embeddable
public class MediaCostRuleSource {


@Column(name = "source_name")
private String sourceName;

@Column(name = "ordinal")
private Integer ordinal;

================================================== ================

public class MediaCostRuleDto extends AbstractAdminDto {


@Size(min = 1)
private Set<MediaCostRuleSource> mediaCostRuleSources = new HashSet<MediaCostRuleSource>();


@NotNull
private String name;

================================================== =========================

今私が望むのは、mediaCostRuleSources とエンティティの名前だけをフェッチし、それを (AliasToBeanResultTransformer を使用して) MediaCostRuleDto に直接注入するために Projections を使用することです。

次のコードを試しました:

@Test
public void findByIdDirectTest2(){

    Criteria crit = sessionFactory.getCurrentSession().createCriteria(MediaCostRule.class).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

    ProjectionList projectionList = Projections.projectionList();
    projectionList.add(Projections.property("name").as("name"));
    projectionList.add(Projections.property("mediaCostRuleSources").as("mediaCostRuleSources"));
    crit.setProjection(projectionList);
    List list = crit.list();
}

しかし、私は常に例外を取得しています (ArrayIndexOutOfBoundsException)

Hibernateでそのようなことを行うには、何らかの方法が必要です

どのようにするか知っていますか ??

よし

4

1 に答える 1

0

使用する必要があります

crit.setFetchMode("mediaCostRuleSources",FetchMode.JOIN)
于 2013-08-05T15:07:22.720 に答える