我们可以从hql查询中获取单个对象吗?

时间:2015-01-12 12:14:59

标签: java mysql hibernate hql

我在hql中编写一个select查询,我的任务是激活总线。首先,我将从客户端获取一个消息busId#busStatus,所以首先我寻找这个特定的busId是活动的还是非活动的所以我必须编写select查询但是在hibernate中query.list()返回list。在这里我认为列表是不必要的,单个对象就足够了。

这是我的代码,

    String hql="from BusDetailBean where Busid= :busId and bus_status=:busStatus";
        Query query = session.createQuery(hql);
        query.setParameter("busId", busId);
        query.setParameter("busStatus", busStatus);

        List<BusDetailBean> busDetails=(List<BusDetailBean>)query.list(); 
       if(busDetails.isEmpty())
        {
             //my other stuff
        }
         else
         {

            //bus ativation stuff
         }

我的问题是,如果列表不为空,则select查询只返回一个对象我必须在else部分中使用for循环。那么我该如何优化这段代码呢。任何人都可以帮助我。

6 个答案:

答案 0 :(得分:6)

您可以使用query.getSingleResult()

答案 1 :(得分:1)

您可以在列表中的索引0处获取对象:

List l = query.list() 
if (l.size()>0) {
  return l.get(0)
}

答案 2 :(得分:1)

您可以使用query.setMaxResults(1);

答案 3 :(得分:1)

我不认为坚持应该与商业逻辑混合在一起。

如果从persitence图层返回Optional以及结果是否存在或者不存在更高级别的事情呢?

在持久层中,例如:

return query.list() .stream() .findFirst()

根据文档,如果集合为空,这将返回第一个结果或空可选。

然后:

Optional<Bus> optionalBus = repository.find(busId, busStatus);
if (optionalBus.isPresent()) {
    something here
} else {
    something else
}

答案 4 :(得分:1)

对于此类问题,Hibernate中的现成解决方案是使用uniqueResult()类中的Query方法:

public Object uniqueResult()

来自Hibernate JavaDocs:

  

返回与查询匹配的单个实例的便捷方法,   如果查询未返回任何结果,则为null

     

返回:单个结果或null

     

抛出:

     
      
  • NonUniqueResultException - 如果有多个匹配结果
  •   
  • HibernateException
  •   

答案 5 :(得分:0)

使用query.uniqueResult()你不能确保如果你有很多结果,那么你只会得到其中一个。

使用uniqueResult(),您可以在结果集中放置一个保护/约束,以便知道此查询应始终返回唯一结果。