2017-10-16 7 views
0

私はより多くの列を持っているし、私のエンティティクラスが持っているクエリがあります。結果はhibernateのネイティブクエリから得られたものですか?

苦情を休止させないために、私は

@Transient 
private Integer count; 

のようにフィールドに注釈を追加する必要があります。しかし、これを行うことで、カウントをマッピングすることはできませんハイバネートます。私のクエリは

session.createSQLQuery("SELECT p.*, count(p.id), sqrt(1+2) as distance FROM post p group by p.id") 

です。クエリが論理的に意味をなさないと私は知っています。これは単なる例です。上記のクエリから返された列は、ポスト内のすべてと2つの余分な列(カウントと距離)を持ちます。私は結果を私のentityにマップしたいと思っていました。カウントと距離には@Transientと注釈がついています。私はそうするのが嬉しいです。目標はエンティティでこれを行うのではなく、マップされた結果を持つclassです。私はaddEntity()に電話してみましたが、役に立たないようです。

+0

をあなたは本当に結果として実体を必要ですか?このクエリから返されたデータを変更したいのですか? –

+0

いいえ、そういうわけで、目標はエンティティではないクラスを持つことだと言いました。私はエンティティを持っていました。なぜなら、これを達成するためにエンティティを使用するポストを見つけたからです。それが私が試した最後のものでした – user1865027

答えて

1

結果セットトランスフォーマーを使用してこれを実現できます。

ステップ1)あなたは

ステップ2を返すために行くの照会がすべてのフィールドに新しいDTOクラスを作成します)

setResultTransformer(Transformers.aliasToBean(DTO.class)) 

以下の行を追加します。例:

List resultWithAliasedBean = session.createQuery(
    "SELECT p.*, count(p.id), sqrt(1+2) as distance FROM post p group by p.id") 
    .setResultTransformer(Transformers.aliasToBean(DTO.class)) 
    .list(); 

DTO dto = (DTO) resultWithAliasedBean.get(0); 

注意:DTOクラスのフィールド名が、クエリが返す列名と一致することを確認します。

0

私はあなたがHibernateを使用しているので、Yathishの回答がうまく動作することがわかります。

しかし、あなたはJPA仕様でそれをしたいならば、あなたはDTOにSQL結果セットから列のマッピンをspecifiyする必要が結果セットのマッピング

あり
Query q = em.createNativeQuery(
    "SELECT c.id, c.name, COUNT(o) as orderCount, AVG(o.price) AS avgOrder " + 
    "FROM Customer c " + 
    "JOIN Orders o ON o.cid = c.id " + 
    "GROUP BY c.id, c.name", 
    "CustomerDetailsResult"); 

@SqlResultSetMapping(name="CustomerDetailsResult", 
    classes={ 
     @ConstructorResult(targetClass=com.acme.CustomerDetails.class, 
      columns={ 
       @ColumnResult(name="id"), 
       @ColumnResult(name="name"), 
       @ColumnResult(name="orderCount"), 
       @ColumnResult(name="avgOrder", type=Double.class)}) 
    }) 

を使用することができます。

これが複雑であると思われる場合は、QLRM(Query Lanaguage Result Mapper)と呼ばれるオープンソースプロジェクトがあり、SQL文をPOJOにマッピングします。

http://simasch.github.io/qlrm/

そして、少なくとも最後のではなく、jOOQを見ていないなぜあなたは広範なSQL処理を行います場合:https://www.jooq.org/

関連する問題