私は次のようなクラス構造を持っています
class ABC {
abcid;
name;
listOfXYZObjects;
}
class XYZ {
xyzid;
name;
}
上記のクラスを hbm ファイルに設定しました。すでにDBに保存されているデータがあります。私は abcId と xyzId を持っていて、単一の HQL クエリで両方のクラスの名前フィールドのみを取得したいと考えています。
上記のガイドを教えてください。
ABC が大学生で、XYZ が学生であるとします。Criteria を使用すると、次のように大学名と学生名を取得できます。
Criteria c = s.createCriteria(College.class,"clg");
c.createCriteria("students", "s");
c.add(Restrictions.eq("id",new Integer(1)));
c.add(Restrictions.eq("s.id", new Integer(1)));
ProjectionList properties = Projections.projectionList();
properties.add(Projections.property("name"));
properties.add(Projections.property("s.name"));
c.setProjection(properties);
List l=c.list();
Iterator it=l.iterator();
while(it.hasNext())
{
Object ob[] = (Object[])it.next();
System.out.println(ob[0]+"--------"+ob[1]);
}
出力:
Hibernate: this_.name を y0_ として選択し、s1_.name を y1_ として選択します。および s1_.id=?
SCASCカレッジ--------学生1
以下の hql クエリを使用します。
select new map(a.ABCname , b.XYZname)
from ABC a, XYZ b
where a.abcid = "+abcid+" and b.xyzid = "+xyzid+"
from 句の場所はABC
pojo クラスとXYZ
pojo クラスです。ここでは、両方のクラスの名前フィールドに異なる名前を付ける必要があります。または、outnew map
句を使用することもできます。
しかし、new map
句を使用すると、はるかに簡単になります。
これがお役に立てば幸いです。
クッシュ
XYZ クラスが ABC クラスに関連付けられるように hbm を構成した場合、取得は、クラス ABC からのみ取得しているかのようになります。
例えば :getHibernateTemplate().load(ABC.class, someABCId);
ABC の Hbm :
<class name="ABC" table="abc_table" mutable="false">
<cache usage="read-only"/>
<id name="abcId" column="id">
<generator class="increment"/>
</id>
<property name="name" column="name"/>
<list name="listOfXYZObjects" lazy="true" >
<key column="abc_id"/>
<index column="id"/>
<one-to-many class="XYZ"/>
</list>
</class>