2017-06-22 137 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'清理参数图书馆 –