hibernate 多表查询

最近在项目中使用了hibernate作为ORM框架,很多情况下都需要使用到多表联合查询,使用hibernate时,由于对于多表没有相应的实体类与数据库表相对应,因此不方便直接使用HQL进行查询,通过网上查找,发现hibernate的session可以通过调用createSQLQuery()方法直接执行SQL语句,返回的是SQLQuery,在调用list()方法就可以获取查询出来的数据:

public List getListFromMutiTable(String sql) {
		SQLQuery queryUpdate = getHibernateTemplate().getSessionFactory().getCurrentSession().createSQLQuery(sql);
		
		List objectList = queryUpdate.list();
		return objectList;
	}

它们都将返回一个Object数组(Object[])组成的List,数组每个元素都是所查询表的一个字段值,每一行对应一个Object[]数组。Hibernate会使用ResultSetMetadata来判定返回的标量值的实际顺序和类型:

public List<YiYaEventTipsStats> retrieveActivityStatsInfoList() {
		
		List<YiYaEventTipsStats> eventTipsStatsList = new ArrayList<YiYaEventTipsStats>();
		
		String hql = "select tips.id,tips.title,tips.startTime,tips.endTime,tips.joinCount,u.winCount "
                        + "from (select t.id,t.title,t.starttime,t.endtime,count(u.tipid) joinCount from yiya_eventtips t left join yiya_eventtipsuser u on t.id=u.tipid group by t.title,t.id,t.starttime,t.endtime) tips "
                        + "left join (select t.tipid,count(t.tipid) winCount from yiya_eventtipsuser t where t.iswin=1 group by t.tipid) u on tips.id=u.tipid";
		
		List list = baseDao.getListFromMutiTable(hql);
		int size = list.size();
		for(int i=0; i<size; i++) {
			YiYaEventTipsStats eventTipsStats = new YiYaEventTipsStats();
			BigDecimal  id = (BigDecimal )((Object[])list.get(i))[0];
			eventTipsStats.setId(id);
			
			String title = (String)((Object[])list.get(i))[1];
			eventTipsStats.setTitle(title);
			
			Date startTime = (Date)((Object[])list.get(i))[2];
			eventTipsStats.setStartTime(startTime);
			
			Date endTime = (Date)((Object[])list.get(i))[3];
			eventTipsStats.setEndTime(endTime);
			
			BigDecimal  joinCount = (BigDecimal )((Object[])list.get(i))[4];
			eventTipsStats.setJoinCount(joinCount);
			
			BigDecimal  winCount = (BigDecimal )((Object[])list.get(i))[5];
			eventTipsStats.setWinCount(winCount);
			
			eventTipsStatsList.add(eventTipsStats);
		} 
		
		System.out.println("size: " + eventTipsStatsList.size());
		
		return eventTipsStatsList;
	}
只能通过解析Object[]数组来获取所有的列植,再调用set方法设置到相应的对象中,这样就可以很方便的对多表进行查询,同时使用hibernate的事务管理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 Hibernate 的关联映射来执行多查询。以下是几种常见的方法: 1. 使用 HQL(Hibernate Query Language)进行关联查询:可以使用 HQL 编写一个包含多个实体的查询语句,并使用 JOIN 或 FETCH 关键字来指定关联关系。例如: ```java String hql = "SELECT p FROM Person p JOIN p.address a WHERE a.city = :city"; List<Person> persons = session.createQuery(hql) .setParameter("city", "London") .list(); ``` 2. 使用 Criteria API 进行关联查询:Criteria API 提供了一种面向对象的查询方式,可以通过创建 Criteria 对象来构建查询条件和关联关系。例如: ```java CriteriaBuilder builder = session.getCriteriaBuilder(); CriteriaQuery<Person> query = builder.createQuery(Person.class); Root<Person> personRoot = query.from(Person.class); Join<Person, Address> addressJoin = personRoot.join("address"); query.where(builder.equal(addressJoin.get("city"), "London")); List<Person> persons = session.createQuery(query).getResultList(); ``` 3. 使用注解配置关联关系:可以在实体类中使用注解来配置关联关系,然后使用 Criteria API 或者 HQL 来执行查询。例如: ```java @Entity public class Person { // ... @ManyToOne @JoinColumn(name = "address_id") private Address address; // getters and setters } ``` 这样配置之后,你可以使用 Criteria API 或者 HQL 来进行查询。 这些是 Hibernate 中执行多查询的几种常见方法,你可以根据自己的需求选择适合的方法。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值