2016-05-02 11 views
0

テーブル訪問者のPostgresqlデータベースから行を取得しようとしました。しかし、私はすべての列を必要としませんが、カスタムクエリを実行する現時点では、それは動作しません。カスタムクエリを作成してHibernate内の特定の列を取得します

EntityManager em = emf.createEntityManager(); 

Query query = em.createQuery("SELECT visitor_id, first_name, last_name, email, company, country_id FROM Visitor", Visitor.class); 
List<Visitor> result = query.getResultList(); 
return result; 

エラーコンソールが私を示しては、以下のとおりです。

org.hibernate.exception.SQLGrammarException:クエリに org.postgresql.util.PSQLExceptionを実行できませんでした:列名の都市が見つかりませんでした でこのResultSet

SELECT visitor_id, city, company, email, email_confirmed, first_name, 
     identification_number, identification_other, image, is_active, 
     job_title, last_name, mobile_number, password, phone_number, 
     province, country_id, created_by, identification_type_id 
FROM visitor; 

すべての列があります。だから、私はすべての行を取得し、それをbindRegisterToDashboard();という別の関数で設定する関数を呼び出します。この関数は、テーブルからオブジェクトvisitorDashBoardViewModelまでの6つの列のみを設定し、ビューに表示します。

//service file code 
for (Visitor item: getVisitors()) { 
    visitorDashBoardViewModel.add(bindRegisterToDashboard(item); 
} 
return visitorDashBoardViewModel; 

ビジターモデル:

@Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long visitorId; 

    private String identificationOther; 
    private long identificationNumber; 
    private String firstName; 
    private String lastName; 
    private String email; 
    private boolean emailConfirmed; 
    private String phoneNumber; 
    private String mobileNumber; 
    private String password; 
    private String province; 
    private String city; 
    private String company; 
    private String jobTitle; 
    private Boolean isActive; 
    private byte[] image; 


    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @JoinColumn(name="identification_type_id") 
    private IdentificationType identificationType; 

    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.LAZY) 
    @JoinColumn(name = "country_id", nullable = false) 
    private Country country= new Country(); 
+0

こんにちは天使。あなたは - > \ d + tablenameかテーブルの列を記述してください。+出力から関数に失敗していないようです。 "ヒップから"私は結果セットの操作でそのことを言っていると思います。 – pnorton

+0

私はquesionを編集しました。ありがとう。 –

答えて

0

はあなたのクエリは、ビジターのインスタンスを返しません。オブジェクトの配列を返します。したがって、TypedQuery<Visitor>ではなく、単にQueryとなるはずです。また

Query query = em.createQuery("SELECT v.visitorId, v.firstName, v.lastName, v.email, v.company, v.country.id FROM Visitor v"); 
List<Object[]> rows = query.getResultList(); 
// now, in each Object[], visitor_id is at index 0, first_name at index 1, etc. 

、Javaの命名規則尊重してください:などのid、firstNameの、lastNameのを、

あなたのクエリがビジターのインスタンスを返すようにしたい場合は、それがあるべき

TypedQuery query = em.createQuery("SELECT v from Visitor v"); 
List<Visitor> visitors = query.getResultList(); 
+0

カスタムクエリを実行する目標は、それが.2秒を費やすことであり、すべての列クエリを実行すると14秒かかります。私はあなたの答えを実装するが、それは私にエラーが表示されます。 java.lang.IllegalStateException:ノードのデータ型がありません:org.hibernate.hql.internal.ast.tree.IdentNode <| + - [IDENT] IdentNode: 'visitor_id' {originalText = visitor_id} <| –

+0

更新されたクエリを参照してください。エンティティにvisitor_idという名前のフィールドがありますか?このような単純なクエリは、いくつかの選択された列をいくつか選択するだけで、2秒から14秒になる可能性はありません。たぶんあなたのエンティティに熱心にフェッチされた関連がたくさんある場合を除きます。あなたの質問にVisitorのコードを投稿してください。 –

+0

ビジターモデルコードを投稿します。 –

関連する問題