后台:
Session session = HibernateSessionFactory.getSession();
String sql = "from Uploadfiles";
Query q = session.createQuery(sql);
List<Uploadfiles> filesList = q.list();
session.close();
return filesList;
前台:
<s:iterator var="file" value="%{filesList}">
<tr>
<td>
${file.filename}
</td>
<td>
${file.label}
</td>
<td>
${file.fileuser.username}
</td>
<td>
${file.uploadtime}
</td>
<td>
<s:a href="downloadFiles_MainAction?fileid=%{file.id}"></s:a>
</td>
</tr>
</s:iterator>
这时 ${file.fileuser.username}怎么也显示不对,fileuser是Uploadfiles中的一个实体类,测试了不是el表达式的错误,后来在后台打印输出了一下:
Query q = session.createQuery(sql);
List<Uploadfiles> filesList = q.list();
// for(Uploadfiles f:filesList){
// System.out.println("user list is "+f.getFileuser().getUsername());
// }
session.close();
return filesList;
前台居然显示出来了,我以为成功了,就把多余的删掉,后来又出错。之后才明白,Query中的list()是懒加载,也叫延迟加载,只是一次加载了本表中的数据,对于关联表的数据没有加载,解决办法是:在实体类配置文件中加入
<many-to-one name="fileuser" class="com.main.entity.Fileuser"
fetch="select" cascade="all" lazy="false">
<column name="uploaderid" not-null="true" />
</many-to-one>
就解决了。
当然,这是最不完美的做法,数据量很大的话导致查询数据过多,服务器负担严重,小项目的话还是可以的,还有就是在后台输出一下,让其加载查询一下,看起来也不是那么好的解决办法,恕我知识面不足,新手一个,暂时只能想到这样。