2017-01-26 4 views
2

Hibernateで指定されたselect文を実行しようとすると、Internal Server Error(500エラー以外のTomcatログには何も書き込まれません)が発生します。伝統的なシンプルなselectのステートメントを実行すると、問題はありません。Hibernate Projection select文で内部サーバエラーが発生する

私はコンソールにハイバネートクエリを記録しています。正常に動作休止クエリは、ちょうど伝統的なselect文 (select x from Entity x)です:Javaは選択を実行しているselect x.property... from Entity x

Hibernate: 
     select 
      trumpialis0_.TLDLDNM as col_0_0_ 
     from 
      LIBRARY.TABLE trumpialis0_ 
     where 
      trumpialis0_.TLDLSTS='W' 

を実行しているときに休止状態クエリ

Hibernate: 
    select 
     trumpialis0_.TLDLID as TLDLID1_0_, 
     trumpialis0_.TLDLDNM as TLDLDNM2_0_, 
     trumpialis0_.TLDLMSG as TLDLMSG3_0_, 
     trumpialis0_.TLDLNAM as TLDLNAM4_0_, 
     trumpialis0_.TLDLDAB as TLDLDAB5_0_, 
     trumpialis0_.TLDLSTS as TLDLSTS6_0_ 
    from 
     LIBRARY.TABLE trumpialis0_ 
    where 
     trumpialis0_.TLDLSTS='W' 

です:rows = em.createQuery("select x.displayName from X where x.webStatus = 'W'").getResultList();

私の団体は次のようになります:

@Entity 
@Table(name = "TABLE", schema = "LIBRARY") 
@XmlRootElement 
public class X { 
    private String id; 
    private String name; 
    private String displayName; 
    private String webStatus; 
    private String messagesPerMonth; 

    @Id 
    @Column(name = "TLDLID") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    .... 

IntellijでJPA-QLクエリを実行して、好きな列だけを取得できますが、列名が失われているようです。

特定のプロパティを選択できる方法はありますか?私はすべてを返す必要はなく、実際には "返品オブジェクト"などにキャストしたくないのです。

+0

ゼロで除算すると、ログに役立つ情報が表示されるのですか、説明なしのプレーンな500が表示されますか? –

+0

どこで0で除算しますか? –

+0

が実行されると思われる場所で実行してください。おそらく "選択を実行しているJava"の直前です。 –

答えて

0

私の問題は多次元でした。

まず、私はselect文の中で正しい構文を使用していませんでした。私が本当に必要なのは、既存のものから新しいエンティティを作成することでした。私はついにこれをGoogleに持ち込み、デバッガをステップ実行することを実現しました。 の後に私のコードは失敗しませんでした。結果自体ではなく、結果で何かをしたかったのです。

rows = em.createQuery("select NEW com.example.entities.Entity(list.id, list.name, list.displayName, list.messsagesPerMonth) from Entity list where list.webStatus = 'W'").getResultList(); 

は今、正しくこの作品を持っているために、IntelliJのエンティティにそのnoなコンストラクタexists私を警告するために十分にスマートだったので、私は、これらの値のオフに基づいてコンストラクタを作成し、これを追加する必要がありました私の他の生成されたエンティティコード。

最後に、有用なデバッグを一切行わずにHibernateを爆発させるコードは、OOで全く経験していなかった。

エンティティプロパティにnull値を設定することはできますが、文字列の長さ全体に基づいて文字列を返すレガシーデータベースを扱う場合は、Entity内の文字列を整理することができます。 DBから戻った後に空白が多く含まれています。

残念ながら、私がこれをやっていたのはproperty.trim()getName()などの返信文で単純でした。 al。メソッド。私は必要なもの

public String getMesssagesPerMonth() { 
    return messagesPerMonth; 
} 

プロパティがnullに設定された場合、それはtrim()null値を試してみないようにエラーチェックで何か少しより堅牢でした。

public String getMesssagesPerMonth() { 
    if (messagesPerMonth != null) { 
     return messagesPerMonth.trim(); 
    } else { 
     return messagesPerMonth; 
    } 
} 
関連する問題