问题我描述下就是有三个一对一的表,我查询主表 然后分页显示,控制台输出如下代码:前两条是分页的,这个我知道,后面有重复的查询了几次,实验了下,表里面有多少数据就是查询语句就是多少条数据的两倍,不知道是什么原因,检查下不是级联问题吧,找过了很多这个了,有人说是分页标签写的有问题,所以我发出来想让大家看看,具体我会详细描述及提供代码,望大家交流下!分不够可以加~输出查询的列表控制台输出SQL如下:
Hibernate: select count(*) as col_0_0_ from report.dbo.UserReport userreport0_
Hibernate: select top 20 userreport0_.ID as ID5_, userreport0_.UserName as UserName5_, userreport0_.Sex as Sex5_, userreport0_.IdCard as IdCard5_, userreport0_.PostCode as PostCode5_, userreport0_.Address as Address5_, userreport0_.Area as Area5_, userreport0_.Phone as Phone5_, userreport0_.Mobile as Mobile5_, userreport0_.Email as Email5_, userreport0_.ReportIP as ReportIP5_, userreport0_.FindCode as FindCode5_, userreport0_.ReportType as ReportType5_, userreport0_.ReadFlag as ReadFlag5_, userreport0_.ReplyContent as ReplyCo15_5_, userreport0_.AddDate as AddDate5_ from report.dbo.UserReport userreport0_
Hibernate: select reportedus0_.ID as ID6_0_, reportedus0_.UserName as UserName6_0_, reportedus0_.Sex as Sex6_0_, reportedus0_.Polity as Polity6_0_, reportedus0_.Unit as Unit6_0_, reportedus0_.PLevel as PLevel6_0_, reportedus0_.area as area6_0_, reportedus0_.Problem as Problem6_0_, reportedus0_.AddDate as AddDate6_0_, reportedus0_.UserID as UserID6_0_ from report.dbo.ReportedUser reportedus0_ where reportedus0_.UserID=?
Hibernate: select reportedun0_.ID as ID7_0_, reportedun0_.UnitName as UnitName7_0_, reportedun0_.Area as Area7_0_, reportedun0_.Problem as Problem7_0_, reportedun0_.AddDate as AddDate7_0_, reportedun0_.UserID as UserID7_0_ from report.dbo.ReportedUnits reportedun0_ where reportedun0_.UserID=?具体的是有三个一对一的表,映射文件关系如下如下:表UserReport(主键ID)--->>ReportedUser(外键UserID)
表UserReport(主键ID)-->>ReportedUnits(外键UserID)
UserReport.hbm.xml<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.vo.UserReport" table="UserReport"  schema="dbo" catalog="report"   dynamic-insert="true" dynamic-update="true">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native"></generator>
        </id>
        <property name="userName" type="java.lang.String">
            <column name="UserName" length="50" />
        </property>
        <property name="sex" type="java.lang.Integer">
            <column name="Sex" length="100" />
        </property>
        <property name="idCard" type="java.lang.String">
            <column name="IdCard" length="50" />
        </property>
        <property name="postCode" type="java.lang.String">
            <column name="PostCode" length="50" />
        </property>
        <property name="address" type="java.lang.String">
            <column name="Address" length="200" />
        </property>
        <property name="area" type="java.lang.String">
            <column name="Area" length="50" />
        </property>
        <property name="phone" type="java.lang.String">
            <column name="Phone" length="50" />
        </property>
        <property name="mobile" type="java.lang.String">
            <column name="Mobile" length="50" />
        </property>
        <property name="email" type="java.lang.String">
            <column name="Email" length="50" />
        </property>
        <property name="reportIp" type="java.lang.String">
            <column name="ReportIP" length="50" />
        </property>
        <property name="findCode" type="java.lang.String">
            <column name="FindCode" length="50" />
        </property>
        <property name="reportType" type="java.lang.Integer">
            <column name="ReportType" />
        </property>
        <property name="readFlag" type="java.lang.Integer">
            <column name="ReadFlag"/>
        </property>
        <property name="replyContent" type="java.lang.String">
            <column name="ReplyContent" length="500" />
        </property>
        <property name="addDate" type="java.util.Date">
            <column name="AddDate" length="23" not-null="false" />
        </property>
        <one-to-one name="reportedUser" property-ref="userReport" cascade="delete"></one-to-one>
        <one-to-one name="reportedUnits" property-ref="userReport" cascade="delete"></one-to-one>
    </class>
</hibernate-mapping>
ReportedUser
 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.vo.ReportedUser" table="ReportedUser" schema="dbo" catalog="report">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native"></generator>
        </id>
        <property name="userName" type="java.lang.String">
            <column name="UserName" length="50" />
        </property>
        <property name="sex" type="java.lang.Integer">
            <column name="Sex" />
        </property>
        <property name="polity" type="java.lang.String">
            <column name="Polity" length="50" />
        </property>
        <property name="unit" type="java.lang.String">
            <column name="Unit" length="150" />
        </property>
        <property name="plevel" type="java.lang.String">
            <column name="PLevel" length="50" />
        </property>
        <property name="area" type="java.lang.String">
            <column name="area" length="200" />
        </property>
        <property name="problem" type="java.lang.String">
            <column name="Problem" length="5000" />
        </property>
        <property name="addDate" type="java.util.Date">
            <column name="AddDate" length="23" />
        </property>
        <many-to-one name="userReport" class="com.vo.UserReport"  lazy="false">
            <column name="UserID" not-null="true" unique="true" />
        </many-to-one>
        
    </class>
</hibernate-mapping>ReportedUnits.hbm.xml<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.vo.ReportedUnits" table="ReportedUnits" schema="dbo" catalog="report"  dynamic-insert="true" dynamic-update="true">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native"></generator>
        </id>
        <property name="unitName" type="java.lang.String">
            <column name="UnitName" length="200" />
        </property>
        <property name="area" type="java.lang.String">
            <column name="Area" length="200" />
        </property>
        <property name="problem" type="java.lang.String">
            <column name="Problem" length="1000" />
        </property>
        <property name="addDate" type="java.util.Date">
            <column name="AddDate" length="23" />
        </property>
        <many-to-one name="userReport" class="com.vo.UserReport" fetch="select" lazy="false">
            <column name="UserID" not-null="true" unique="true" />
        </many-to-one>
    </class>
    
</hibernate-mapping>action处理查询分页的:package com.action.manager;import java.util.List;import com.action.DefaultPageAction;
import com.vo.UserReport;/**
 * @author niu
 * @version Jun 16, 2009
 */
public class listReportedAction extends DefaultPageAction { /**
 * 
 */
private static final long serialVersionUID = 1L; private List<UserReport> listUserreport; @Override
public String execute() throws Exception {
try {
this.processPage(this.userReportDao.getCount());
listUserreport = this.userReportDao.getAll(this.getPageStart(),
this.getPageLength());
return SUCCESS;
} catch (Exception e) {
e.printStackTrace();
}
return SUCCESS; } public List<UserReport> getListUserreport() {
return listUserreport;
} public void setListUserreport(List<UserReport> listUserreport) {
this.listUserreport = listUserreport;
}}
继承的分页类DefaultPageAction.java spring 负责初始页码 和页面长度的注入private int pageLength; // 每页数据显示长度 private int currentPage; // 当前页 private int maxPage; // 最大页 private int pageStart; // 每页的起始数据行 public void processPage(int count) {
// 获取请求时首先根据总行数和每页显示行数计算一下总页数
if (count != 0 && count % this.getPageLength() == 0) {
this.setMaxPage(count / this.getPageLength());
} else {
this.setMaxPage(count / this.getPageLength() + 1);
}
}
set……
get……dao方法实现类 public List<UserReport> getAll(int start, int length) throws Exception {
Session session = this.getSession();
List list = session.createQuery("from UserReport")
.setFirstResult(start).setMaxResults(length).list();
this.releaseSession(session);
return list;
} public int getCount() throws Exception {
List list = (List) this.getHibernateTemplate().find(
"select count(*) from UserReport");
return ((Long) list.get(0)).intValue();
}
具体分页是用的分页标签 需要看分页标签的说下,我发布上分页标签 

解决方案 »

  1.   

    晕,你看看sql语句是否 进行了嵌套查询。既然控制台打印出来,说明肯定是执行了这个sql
      

  2.   

    真是Sql打印出来语句,所以说肯定是执行了,所以要处理这种没有必要的查询吧。
      

  3.   

    后面两条应该是hibernate的 hql查询。如果涉及到对象查询,如只通过id查询实体类对象,hibernate会把字段中所有数据进行查询一遍
      

  4.   

    用的这个
    public List<UserReport> getAll(int start, int length) throws Exception {
    Session session = this.getSession();
    List list=session.createCriteria(UserReport.class).setFirstResult(start).setMaxResults(length).list();
    // List list = session.createQuery("from UserReport")
    // .setFirstResult(start).setMaxResults(length).list();
    this.releaseSession(session);
    return list;
    }
    用这个就不会产生上述的那个问题。