2017-06-22 202 views
0

動態排序我有一個DAO方法的返回「上崗」的名單,看起來像這樣:休眠 - 在查詢

public List<PostDTO> getPosts() { 
    Session session = sessionFactory.getCurrentSession(); 

    return postList = session 
      .createQuery("select new com.poster.app.dto.PostDTO(p.id, p.date, p.title, p.text, p.imageUrl, p.author, p.category, count(c.post.id)) " 
          + "from Post as p left join Comment as c ON p.id = c.post.id group by p.id", 
        PostDTO.class).getResultList(); 
} 

因此,它基本上只是創建查詢並返回DTO在這種情況下。事情是,我需要獲取完全相同的列表,但不同的排序。就像我需要動態地按「最新」,「最受歡迎」和「評論編號」對它進行排序,我想用一種方法做到這一點,而不是爲每個方法創建3種方法(「最新」,「最流行」和「評論數量「),我怎麼能做到這一點在休眠?

+0

您可以用'爲了by'排序 – Hema

回答

0

你有選擇之間:

  • 使用的API標準,以建立您的查詢,BY子句動態添加您的訂單。
  • BY子句在查詢的結束取決於與第二個選項添加的順序您的PARAM

例如:

public List<PostDTO> getPostsOrderBy(String orderParam) 
{ 
    Session session = sessionFactory.getCurrentSession(); 

    String query = "select new com.poster.app.dto.PostDTO(p.id, p.date, p.title, p.text, p.imageUrl, p.author, p.category, count(c.post.id)) " 
      + "from Post as p left join Comment as c ON p.id = c.post.id group by p.id order by "+ orderParam; 


    return postList = session.createQuery(query,PostDTO.class).getResultList(); 
} 
+0

當心SQL注入。我會使用setString()來防止這種情況。 – danieljohngomez

+0

@danieljohngomez your're正確,但order by子句不接受輸入參數,只能在where或having子句中使用它,所以我們需要使用Apache Commons-Lang中的'StringEscapeUtils.escapeSql'清理參數圖書館 –