Hibernateを使用してデータベースからオブジェクトをロードする際に問題があります。Hibernateでmany-to-many関係を持つオブジェクトのいくつかのcolをロードする方法
"A"、 "B"、 "C"の3つのJavaクラスがあります。 AおよびBは、追加テーブル "a_join_b"によって、mamy-to-many関係として関連付けられます。 AおよびCは、多対1の関係として関連付けられます。
コードがあります:
@Entity
@Table(name = "A")
public class AclassEnt implements java.io.Serializable{
@Id
@TableGenerator(name = "inventory",
table = "hibernate_sequences",
pkColumnName = "sequence_name",
pkColumnValue = "Emp_Gen",
valueColumnName = "sequence_next_hi_value",
initialValue = 0,
allocationSize = 100)
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "A_ID", nullable = false)
private Integer aId;
@Column(name = "A_NUMBER", length = 20)
private String aNumber;
@Column(name = "A_NAME", length = 15)
private String aName;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE},
fetch = FetchType.EAGER,
targetEntity=WorkersEnt.class)
@JoinColumn(name="C_ID")
private CclassEnt cclass;
@ManyToMany(cascade = CascadeType.REFRESH,fetch = FetchType.LAZY,targetEntity = BclassEnt.class)
@JoinTable(name = "A_join_B", joinColumns = { @JoinColumn(name = "A_ID") }, inverseJoinColumns = { @JoinColumn(name = "B_ID") })
private Set<BclassEnt> BclassList=new HashSet<BclassEnt>();
//getters and settrs
}
@Entity
@Table(name = "B")
public class MeasureTypeEnt implements java.io.Serializable{
@Id
@TableGenerator(name = "inventory",
table = "hibernate_sequences",
pkColumnName = "sequence_name",
pkColumnValue = "Emp_Gen",
valueColumnName = "sequence_next_hi_value",
initialValue = 0,
allocationSize = 100)
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "B_ID", nullable = false)
private Integer bId;
@Basic(optional = false)
@Column(name = "B_NAME", nullable = false, length = 100)
private String bName;
//getters and setters
}
質問:どのように私はhextフィールドを持つオブジェクト "AclassEnt" を読み込むことができます:援助、もしaName、cclassとBclassList ???
次のコードを使用すると、すべてのcolをロードできます。最後に実行する必要があります。私は "BclassList"を意味します。
Criteria crit = session.createCriteria(AclassEnt.class,"c");
crit.createAlias("cclass", "cclass")
.createAlias("BclassList", "BclassList")//<-- is it correctly?
.setProjection(Projections.projectionList()
.add(Projections.property("c.aId").as("aId"))
.add(Projections.property("c.aName").as("aName"))
.add(Projections.property("c.cclass").as("cclass"))
.add(Projections.property("c.BclassList").as("BclassList"))//<-- is it correctly?
);
AclassEnt result = crit.setResultTransformer(new AliasToBeanResultTransformer(AclassEnt.class)).list();
これはできません。条件クエリは、スカラーまたはエンティティのいずれかを返しますが、両方の組み合わせは返しません。しかし、あなたのクエリは、aNumberを除いてAとBとCを含むすべてのものをロードするようです。なぜあなたは絶対に列が読み込まれないようにしたいのですか? –
JB Nizet、それは単なる例です。実際のプログラムでは、A列では20列以上です。今私は単純なレポートを作成する必要があります。私はそれらのうちの5つまたは6つだけを必要とするときに、完全なオブジェクト(23の列)をロードするのは間違っていると思う。 – Vadim
次に、BプロパティとCプロパティの投影を作成し、オブジェクトグラフを自分で再作成する必要があります。私は23列についてはあまり気にしません。それらを取得するコストは、おそらくジョインでクエリを実行するコストに比べて無視できる程度です。 –