2016-05-02 80 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,以在視圖上顯示它。

//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命名約定:身份證,名字,姓氏等

如果你希望你的查詢返回遊客的情況下,它應該是

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

執行自定義查詢的目標是因爲它花費了0.2秒,並且如果我執行所有列查詢花費14秒。我實現你的答案,但它表明我錯了; java.lang.IllegalStateException:節點沒有數據類型:org.hibernate.hql.internal.ast.tree.IdentNode <| + - [IDENT] IdentNode:'visitor_id'{originalText = visitor_id} <| –

+0

查看我更新的查詢。你的實體是否有一個名爲visitor_id的字段?我沒有看到這樣一個簡單的查詢如何從0.2秒到14秒,只需要多選幾列。除非你的實體中有很多渴望獲取的關聯。在您的問題中發佈訪問者的代碼。 –

+0

我發表了訪問者模型代碼。 –