web-dev-qa-db-ja.com

HQLの新しいオブジェクト

HQLクエリからオブジェクトを作成しようとしていますが、私が間違っていることを理解できません。

クエリ:

String query = "SELECT product.code, SUM(product.price), COUNT(product.code)
from Product AS product
GROUP BY product.code"

(または、マップされていなくても、新しいMyCustomList(product.code、SUM(...を使用する必要がありますか?)

class MyCustomList{
  public String code;
  public BigDecimal price;
  public int total;

  // Constructor
  public MyCustomList(String code, String price, int total){ //...

データの取得:

// This throws ClassCastException    
List<MyCustomList> list = MyClass.find(query).fetch();

Playフレームワークの使用

28
Indrek

セクション 15.6。select句 はあなたが達成しようとしていることをカバーしていると思います:

15.6。select句

...

クエリは、複数のオブジェクトやプロパティをObject[]型の配列として返すことができます。

select mother, offspr, mate.name
from DomesticCat as mother
    inner join mother.mate as mate
    left outer join mother.kittens as offspr

またはListとして:

select new list(mother, offspr, mate.name)
from DomesticCat as mother
    inner join mother.mate as mate
    left outer join mother.kittens as offspr

または-クラスFamilyに適切なコンストラクターがあると仮定します-実際のタイプセーフJavaオブジェクトとして:

select new Family(mother, mate, offspr)
from DomesticCat as mother
    join mother.mate as mate
    left join mother.kittens as offspr

あなたの場合、あなたはおそらく以下を望みます:

SELECT new MyCustomList(product.code, SUM(product.price), COUNT(product.code))
from Product AS product
GROUP BY product.code

ここで、MyCustomListは必ずしもマップされたエンティティである必要はありません。

46
Pascal Thivent

これは古い投稿ですが、HQLにも使用できます。

Query query = session.createQuery("SELECT code AS code FROM Product"); 

またはこれはSQLの場合:

Query query = session.createSQLQuery("SELECT code AS code FROM Product");

と:

query.setResultTransformer(Transformers.aliasToBean(MyCustomList.class));
1
Jason Glez