【问题标题】:DAO method retrieve single entryDAO 方法检索单个条目
【发布时间】:2011-02-21 19:40:54
【问题描述】:

我如何编写 DAO 方法,该方法将只返回数据库中的第一个条目。例如,假设我正在查看用户表并且我只想检索第一个条目,我会声明如下方法:

public User getFirstUser(){
    //method logic
}

编辑:

如果这很重要,用户有主键 id

如果这个问题太简单/愚蠢/不管我是 Java 初学者,我深表歉意,所以我正在尝试新事物。谢谢你

我的尝试:

   public User getFirstUser(){
            try { 
                final String getQuery = "SELECT * FROM Users WHERE Id = (SELECT MIN(Id) FROM Users)"; 
                final Query query = getSession().createQuery(getQuery); 
                final int rowCount = query.executeUpdate(); // check that the rowCount is 1 
                log.debug("get successful"); 
//             return what??
            } catch (RuntimeException re) { 
                log.error("get not successful", re); 
                throw re; 
            } 
    }

【问题讨论】:

    标签: java database hibernate dao


    【解决方案1】:

    你可以

    • 使用:

      Query query = session.createQuery("from User");
      query.setMaxResults(1);
      User result = (User) query.uniqueResult();
      
    • 如果您事先知道 ID,请使用 User user = session.get(User.class, id);

    【讨论】:

    • 很抱歉,但我不得不否决这个答案: 1. 如果查询返回多个结果,uniqueResult() 将抛出异常(from User 很可能是这种情况) 2 . 如果只想要其中一个,不要检索所有用户(如果表中有 10⁶ 用户怎么办?) 3. 不要使用不可移植的LIMIT,使用setMaxResults() 并让 Hibernate 完成它的工作。
    • 谢谢,已更新。 (6 小时的会议对人们做坏事 :))
    【解决方案2】:

    获取所有按 id 排序的用户并将结果限制为 1(但不要使用 LIMIT,使用 setMaxResults() 以保持可移植性):

    Query q = session.createQuery("from User u order by u.id");
    q.setMaxResults(1);
    User u = (User) q.uniqueResult();
    

    【讨论】:

      【解决方案3】:

      SELECT * FROM Users WHERE Id = (SELECT MIN(Id) FROM Users)

      :)

      【讨论】:

        【解决方案4】:

        不记得确切但我认为在 JPA 和 Hibernate 中有一个方法 getSingleResult 所以......

        但是这个方法在返回多个结果的时候可能会抛出异常……不记得了……

        其实还有 getResultList 返回一个实体列表,你可以做 list.get(0) 不?

        或者使用 LIMIT 1 创建一个查询?

        【讨论】:

          【解决方案5】:

          在 MS SQL Server 中我们这样做,

          第一个用户,最小 ID,

          SELECT TOP 1 * FROM Users ORDER BY Id
          

          最新用户,最大 ID,

          SELECT TOP 1 * FROM Users ORDER BY Id DESC
          

          谢谢。

          【讨论】:

          • 是的.. 这也适用于 sybase。在 oracle 中它是 Select * from Users where rownum = 1
          猜你喜欢
          • 2015-04-16
          • 1970-01-01
          • 1970-01-01
          • 2019-04-06
          • 1970-01-01
          • 2023-03-18
          • 2011-04-22
          • 1970-01-01
          • 2013-06-05
          相关资源
          最近更新 更多