要给WEB短信群发系统加一个根据时间统计短信发送条数的功能。以前的系统持久层用的Hibernate。对Hibernate也不是很熟悉。分析后一看要多表联查,郁闷!没有玩过Hibernate的多表联查。上网查了一下,通过试验完成任务。趁热总结一下:
如果我有两个表一个User,一个MtLog。关系是User<1-----------*->MtLog。
Hibernate 3.2.5
middlegen 1.3.3
mysql 5.0.17
在数据库中建好表之后用middlegen 自动生成***.hbm.xml文件,有两种方法其中一种是不建立两个表的关系联合查询,另外一种是建立两个表的关系联合查询。首先是不建立两个表的关系联合查询:
User.hbm.xml文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<!--
Created by the Middlegen Hibernate plugin 2.2
http://boss.bekk.no/boss/middlegen/
http://www.hibernate.org/
-->
<class name="org.apache.eason.Test.User" table="user"
lazy="false">
<id name="id" type="java.lang.String" column="ID">
<generator class="assigned" />
</id>
......
<property name="fullname" type="java.lang.String"
column="FULLNAME" not-null="true" length="50" />
......
</class>
</hibernate-mapping>
MtLog.hbm.xml文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<!--
Created by the Middlegen Hibernate plugin 2.2
http://boss.bekk.no/boss/middlegen/
http://www.hibernate.org/
-->
<class name="org.apache.eason.Test.MtLog" table="mt_log"
lazy="false">
<id name="id" type="java.lang.String" column="ID">
<generator class="assigned" />
</id>
<property name="userId" column="USER_ID" type="java.lang.String"
length="32" />
</class>
</hibernate-mapping>
对应的bean文件就不贴了。有三个bean,User.java、MtLog.java、StatMtLog.java
HibernateTest.java
public class HibernateTest
{
public static void mian(String [] args)
{
.....
ScrollableResults srs = session
.createQuery(
"select u.fullname ,sum(ml.count) from User u , MtLog ml where ml.userId = u.id and ml.mtTime > :minRecordTime and ml.mtTime < :maxRecordTime GROUP BY ml.userId")
.setString("minRecordTime", minRecordTime + "%").setString("maxRecordTime", maxRecordTime + "%")
.scroll();
List<StatMtLog> totalList = new ArrayList<StatMtLog>() ;
while(srs.next())
{
totalList.add(new StatMtLog(srs.getString(0),srs.getInteger(1)));
}
....
}
}
下面是建立关系后两表联查的做法
User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<!--
Created by the Middlegen Hibernate plugin 2.2
http://boss.bekk.no/boss/middlegen/
http://www.hibernate.org/
-->
<class name="org.apache.eason.Test.User" table="user"
lazy="false">
<id name="id" type="java.lang.String" column="ID">
<generator class="assigned" />
</id>
......
<property name="fullname" type="java.lang.String"
column="FULLNAME" not-null="true" length="50" />
......
/* user-1--*->mtlog:一对多的关系 */
<set name="mtLogs" lazy="true" inverse="true" cascade="all">
<key>
<column name="USER_ID" />
</key>
<one-to-many class="org.apache.eason.Test.MtLog" />
</set>
</class>
</hibernate-mapping>
MtLog.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<!--
Created by the Middlegen Hibernate plugin 2.2
http://boss.bekk.no/boss/middlegen/
http://www.hibernate.org/
-->
<class name="org.apache.eason.Test.MtLog" table="mt_log"
lazy="false">
<id name="id" type="java.lang.String" column="ID">
<generator class="assigned" />
</id>
......
/* mtlog-*--1->user:多对一的关系 */
<many-to-one name="user" class="org.apache.eason.Test.User"
not-null="true">
<column name="USER_ID" />
</many-to-one>
</class>
</hibernate-mapping>
这样建立关联关系后,要修改一下查询语句
select u.fullname ,sum(
u.mtLogs.count) from User u GROUP BY u.fullname
注意红色部分。
分享到:
相关推荐
hibernate多表联合查询实例,很经典的查询语句和总结.
hibernate 多表查询 hibernate 多表不同于一般的sql嵌套查询,嵌套查询是不支持的,所以必须要配置好才能实现多表!只要配置好了,还是特别好用的
Hibernate 多表连接分页查询示范项目 Hibernate Criteria 多表连接 分页
Hibernate连表查询 Hibernate连表查询
Hibernate 多表映射关系配置 如,一对一 多对一 多对多等
Hibernate多表关联配置及错误解决方法,及时更新,相关信息待下回分解!
hibernate 中间表 希望给予新手帮助
该源代码配了了解释,针对hibernate中多表查询的多种形式进行了总结,很有价值,有Object[]形式的查询,也有对象方式的查询 也有集合list形式的查询,
Hibernate多表查询.txt
根据hibernate映射文件生成表 Configuration cfg = ( new Configuration()).configure(new File("src/hibernate.cfg.xml"));
Hibernate(多对多表操作)
hibernate多对多关系映射案例,配有对应的jar包。
hibernate的表关联操作,通过映射关系操作实体类增删改查数据库-hibernate02
hibernate 无主键表映射资源说明: 1. 简单Demo 2. Demo对应的sql语句 3. 对应博客文档
hibernate多表查询[定义].pdf
Hibernate多对多关联添加及查询示例
Hibernate-基础联表模板,因为不可能记得那么多,所以做个模板,平常自用的
当用到很多复杂的多表联查和复杂的数据库操作时,JDBC有优势。 相同点: ◆两者都是JAVA的数据库操作中间件。 ◆两者对于数据库进行直接操作的对象都不是线程安全的,都需要及时关闭。 ◆两者都可以对数据库的更新...
NULL 博文链接:https://1028826685.iteye.com/blog/1536060
Hibernate表关系总结(一对一,多对一,多对多,单向,双向),有具体实例代码