0

Struts+Spring+Hibernate を使用していますが、HQL を適切に実行するのに問題があります。

objectA、objectB、objectC、objectD の 4 つのオブジェクトがあります。オブジェクト A はオブジェクト B と 1 対多の関係にあり、ObjectB には FK ObjectA.Id があるため、それらは関連付けられています。このパターンはオブジェクト間で続きます。つまり、オブジェクト B はオブジェクト C と 1 対多の関係を持ちます。

私が今行っていることは、「FROM ObjectXVO WHERE objectXId = ?」を呼び出すことです。オブジェクトのリストを取得します。私のアプリケーションはますます複雑になっているため、より複雑な HQL を実行する必要があります。

基本的に必要なのは、ObjectBVO.objectBId を指定すると、指定された ObjectB を持つ ObjectA の特定の列、指定された ObjectB の一部である ObjectC の特定の列、および ObjectC の一部である ObjectD のすべての列を返す必要があることです。指定された ObjectB の一部です。

これは、Microsoft SQL Server で使用している SQL ステートメントです。それは機能しており、うまくいけば私のモデルを実証するでしょう。

SELECT ObjectB.ObjectBID, ObjectB.ObjectBName, ObjectC.ObjectCDescription, 
ObjectD.*, ObjectA.ObjectAID
FROM ObjectB, ObjectC, ObjectD, ObjectA
WHERE ObjectB.ObjectBID = 2 
AND ObjectA.ObjectAID = ObjectB.ObjectAID
AND ObjectB.ObjectBID = ObjectC.ObjectBID
AND ObjectD.ObjectCID = ObjectC.ObjectCID

これは、List< ObjectDVO > を返すために使用しようとしている DAOimpl オブジェクトのコードです。

List<ObjectDVO> objectDs;
try{
String hql = "SELECT ObjectBVO.objectBId, ObjectBVO.objectBName,
    ObjectCVO.objectCDescription, ObjectCVO.objectCId,"
+" ObjectAVO.objectAId, ObjectAVO.objectAName, ObjectDVO"
    +" FROM ObjectBVO, ObjectAVO, ObjectCVO, ObjectDVO"
    +" WHERE ObjectBVO.objectBId = ?"
+" AND ObjectAVO.objectAId = ObjectBVO.objectAId"
+" AND ObjectBVO.objectBId = ObjectCVO.objectBId"
+" AND ObjectDVO.objectCId = ObjectCVO.objectCId";
objectDs = getHibernateTemplate().find(hql, objectBID);
}

これは、null というエラーをスローするだけです。HQL のドキュメントといくつかのチュートリアルを見てきましたが、これを複数の VO オブジェクトで行う方法が明確ではありません。誰でも助けることができますか?ありがとう。

4

1 に答える 1

1

エンティティにエイリアスを割り当て、それらのエイリアスを返す/使用する必要があります。

さらに、説明を考えると、エンティティ間に OneToMany/ManyToOne 関連付けが必要ですが、そのようなものは何もありません。あなたが持っているのは、他のエンティティを指す ID だけです。

このような複数のフィールドを返すクエリは、ObjectDVO のインスタンスを返しません。を返しますList<Object[]>。それぞれObject[]には、クエリによって返された値の 1 つが含まれます: インデックス 0 の objectBId、インデックス 1 の objectBName など。

最後に、VO はエンティティではありません。エンティティに VO という名前を付けないでください。これは基本的Fruitに、Animals にサフィックスを追加するようなものです。

とにかく、示されているようにエンティティを保持する場合 (これはすべきではありませんが、代わりに関連付けを導入します)、クエリは次のようになります。

select b.objectBId, b.objectBName, c.objectCDescription, c.objectCId,
       a.objectAId, a.objectAName, d
from ObjectBVO b, ObjectAVO a, ObjectCVO c, ObjectDVO d
where b.objectBId = ?
and a.objectAId = b.objectAId
and b.objectBId = c.objectBId
and d.objectCId = c.objectCId

ManyToOne 関連付けを使用すると、簡単に実行できます

select d from D d
inner join fetch d.c c
inner join fetch c.b b
inner join fetch b.a a

そして、あなたは得るでしょうList<D>。各 D インスタンスで、次のことができます

String nameOfA = d.getC().getB().getA().getName();

最後の注意: プロパティはクラスの一部です。したがってobjectAId、の ID に名前を付けるのObjectAは冗長です。名前を付けてidください:objectA.getId()よりもはるかに読みやすいですobjectA.getObjectAId()

于 2012-07-27T14:30:28.503 に答える