我在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循环。那么我该如何优化这段代码呢。任何人都可以帮助我。
答案 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(),您可以在结果集中放置一个保护/约束,以便知道此查询应始终返回唯一结果。