如何使用HQL从一对多关联的city与hotel_details表中,根据city_id和hotel_name查询hotel_details数据?
解决思路与代码实现
看起来你需要完成getAvailabilityStatus方法的实现,根据city_id和hotel_name从hotel_details表中查询状态等相关信息。这里有几个关键点需要调整和完善:
1. 修正方法的返回值与参数
你当前的方法返回List<City>,但实际需要的是HotelDetails的数据(比如status、registration等);另外参数里的cityName是冗余的——因为已经传入了cityID,直接通过关联的City主键就能完成筛选,不需要额外的城市名称参数。
2. 编写正确的HQL查询语句
我们可以直接针对HotelDetails实体编写查询,通过关联的city.id和hotelName作为筛选条件,获取你需要的字段或者整个实体对象。
修改后的HotelDetailsDAOImpl代码
@Component @Repository public class HotelDetailsDAOImpl implements HotelDetailsDAO { @Autowired private SessionFactory sessionFactory; @Override @Transactional public Set<String> getHotels() { Session currentSession = sessionFactory.getCurrentSession(); Query<String> theQuery2 = currentSession.createQuery("Select h.hotelName from HotelDetails h", String.class); List<String> listHotels = theQuery2.list(); return new HashSet<>(listHotels); } @Override @Transactional public List<HotelDetails> getAvailabilityStatus(int cityID, String hotelName) { Session currentSession = sessionFactory.getCurrentSession(); // HQL查询:根据city.id和hotelName筛选HotelDetails String hql = "FROM HotelDetails h WHERE h.city.id = :cityId AND h.hotelName = :hotelName"; Query<HotelDetails> theQuery4 = currentSession.createQuery(hql, HotelDetails.class); // 设置参数 theQuery4.setParameter("cityId", cityID); theQuery4.setParameter("hotelName", hotelName); // 返回查询结果列表 return theQuery4.list(); } }
额外说明
- 如果只需要查询特定字段(比如
status、registration),可以修改HQL为:
对应的方法返回值要改成SELECT h.status, h.registration FROM HotelDetails h WHERE h.city.id = :cityId AND h.hotelName = :hotelNameList<Object[]>,或者使用构造函数投影返回自定义DTO对象。 - 注意HQL中的实体属性名要和你的
HotelDetails类中的字段名完全一致(比如hotelName对应数据库的hotel_name,JPA会自动处理映射)。 - 如果你确定每个
cityId+hotelName组合唯一,也可以使用getSingleResult()方法返回单个HotelDetails对象,不过要注意处理NoResultException和NonUniqueResultException。
内容的提问来源于stack exchange,提问作者Prerna Garg
相关产品推荐
相关产品推荐

