hibernate 一对多 查询问题
product物品表,photo物品照片表,一个物品对应5张照片 双向关联映射已经做好了,查product的时候用的criteria条件查询 怎么在查 所有的 product的时候,同时把每个product对应的一张photo也查出来 ?
代码在这里
Goods物品表,photo物品照片表,一个物品对应5张照片 双向关联映射已经做好了,查goods的时候用的criteria条件查询 怎么在查 所有的 goods的时候,同时把每个goods对应的一张photo也查出来 ?
贴代码了,太多了,不爱看的不看吧,高手们帮我看一下,我应该怎么写代码,才能在后台和页面取得photoName。
就是html代码部分我要<img src='../images/<s:property value="photos"/>拿到photoName,这里怎么改才能正确显示图片,怎么做呢?
问题已经解决,更新代码了。
html代码
[xhtml] view plaincopy
- <form id=”searchForm” name=”searchForm” action=”retrieveGoodsAction_retrieveAllGoods”>
- <s:hidden name=”frontGoodsQueryCriteria.sortHelper.colIndex” id=”index” value=”0″></s:hidden>
- <s:hidden name=”frontGoodsQueryCriteria.sortHelper.colName” id=”colName” value=”goodsId”></s:hidden>
- <s:hidden name=”frontGoodsQueryCriteria.sortHelper.sortedType” id=”colType” value=”asc”></s:hidden>
- <s:hidden name=”page.pageNo” value=”1″></s:hidden>
- 省略提交按钮
- <s:iterator value=”page.content” id=”l”>
- <li> 0
- <div class=”pro_disp pro_104px”>
- <a href=’retrieveGoodsAction_retrieveGoodsById?goodsId=<s:property value=”goodsId”></a>’ target=”_blank”>
- <img src=’../imagesGoods/<s:iterator value=”photos”><s:property value=”photoName”/></s:iterator>’ alt=”图片不正确” />
- </a>
- </div>
- <b class=”p_overflow”>
- <a href=’retrieveGoodsAction_retrieveGoodsById?goodsId=<s:property value=”goodsId”></a>’ target=”_blank” title=’<s:property value=”goodsName”/>’>
- <s:property value=”goodsName”/>
- </a>
- </b>
- </li>
- </s:iterator>
- </form>
action代码
[java] view plaincopy
- public class RetrieveGoodsAction extends BaseAction{
- private Integer cateId;
- private Integer goodsId;
- private List<Goods> lgoods;
- private Set<Photo> photos = new HashSet<Photo>(0);
- // 创建page对象,保存分页信息
- Page page = new Page();
- // 创建查询条件,接收页面的adminName,adminDesc,并默认根据adminID排序
- private GoodsQueryCriteria frontGoodsQueryCriteria=
- new GoodsQueryCriteria(new SortHelper(“goodsId”));//默认排序ID
- /**
- * @Title: retrieveAllGoods
- * @Description: (分页查询所有物品,显示在首页上)
- * @return String error or success
- * @throws Exception
- */
- public String retrieveAllGoods() throws Exception{
- page = fgmi.goodsInfoByPage(page, frontGoodsQueryCriteria);
- Iterator itr = page.getContent().iterator();
- while(itr.hasNext()){
- Goods goods = (Goods) itr.next();
- photos = goods.getPhotos();
- System.out.println( ”物品名称:” + goods.getGoodsName());
- Iterator it = goods.getPhotos().iterator();
- while(it.hasNext()){
- Photo ph =(Photo)it.next();
- System.out.println(“图片名:” + ph.getPhotoName());
- }
- //setPhotos(goods.getPhotos());
- System.out.println(“———111++++++++==”);
- }
- if(page != null){
- return ”retrieveSuccess”;
- }
- return ERROR;
- }
- public Integer getCateId() {
- return cateId;
- }
- public void setCateId(Integer cateId) {
- this.cateId = cateId;
- }
- public Integer getGoodsId() {
- return goodsId;
- }
- public void setGoodsId(Integer goodsId) {
- this.goodsId = goodsId;
- }
- public List<Goods> getLgoods() {
- return lgoods;
- }
- public void setLgoods(List<Goods> lgoods) {
- this.lgoods = lgoods;
- }
- public Page getPage() {
- return page;
- }
- public void setPage(Page page) {
- this.page = page;
- }
- public GoodsQueryCriteria getFrontGoodsQueryCriteria() {
- return frontGoodsQueryCriteria;
- }
- public void setFrontGoodsQueryCriteria(
- GoodsQueryCriteria frontGoodsQueryCriteria) {
- this.frontGoodsQueryCriteria = frontGoodsQueryCriteria;
- }
- public Set<Photo> getPhotos() {
- return photos;
- }
- public void setPhotos(Set<Photo> photos) {
- this.photos = photos;
- }
- }
ManagerImpl里的方法
[java] view plaincopy
- /**
- * @Title: goodsInfoByPage
- * @Description: (分页查询)
- * @param page Page对象
- * @param goodsQueryCriteria 查询条件
- * @return page Page对象
- * @throws CampusException
- */
- public Page goodsInfoByPage(Page page, GoodsQueryCriteria frontGoodsQueryCriteria) throws CampusException {
- try{
- page.setTotalRecNum(new Long(frontGoodsDao.queryGoodsTotal(frontGoodsQueryCriteria)));
- page.setContent(frontGoodsDao.queryGoodsByPage(page.getStartIndex().intValue(), page
- .getPageSize(), frontGoodsQueryCriteria));
- return page;
- }catch (Exception e){
- e.printStackTrace();
- //log.debug(e.getMessage());
- throw new CampusException();
- }
- }
dao代码
[java] view plaincopy
- /**
- * @Title: queryGoodsByPage
- * @Description: (分页查询符合条件的Goods实例)
- * @param startIndex 当前页面显示的第一条记录的索引
- * @param fetchSize 页面显示的条数
- * @param frontGoodsQueryCriteria 查询条件
- * @return 符合条件的Goods实例
- * @throws
- */
- public List<Goods> queryGoodsByPage(int startIndex, int fetchSize, GoodsQueryCriteria frontGoodsQueryCriteria) {
- DetachedCriteria criteria=this.buildCriteria(frontGoodsQueryCriteria);
- List<Goods> goods = this.getHibernateTemplate().findByCriteria(criteria, startIndex - 1, fetchSize);
- return goods;
- }
- /**
- * @Title: queryGoodsTotal
- * @Description: (查询符合条件的Goods实例记录数)
- * @param frontGoodsQueryCriteria 查询条件
- * @return integer,符合条件的数目
- * @throws
- */
- public Integer queryGoodsTotal(GoodsQueryCriteria frontGoodsQueryCriteria){
- DetachedCriteria criteria=this.buildCriteria(frontGoodsQueryCriteria);
- criteria.setProjection(Projections.rowCount());
- return (Integer)this.getHibernateTemplate().findByCriteria(criteria).get(0);
- }
- /**
- * @Title: buildCriteria
- * @Description: (创建hibernate查询条件,完成多条件查询功能)
- * @param frontGoodsQueryCriteria 查询条件
- * @return 符合条件的DetachedCriteria实例
- * @throws
- */
- private DetachedCriteria buildCriteria(GoodsQueryCriteria frontGoodsQueryCriteria)
- {
- DetachedCriteria criteria=DetachedCriteria.forClass(Goods.class);
- // 查询条件物品Id
- if (frontGoodsQueryCriteria.getGoodsId() != null){
- criteria.add(Restrictions.like(“goodsId”,frontGoodsQueryCriteria.getGoodsId().trim(), MatchMode.ANYWHERE));
- }
- // 查询条件物品名称
- if (StringUtils.isNotEmpty(frontGoodsQueryCriteria.getGoodsName())){
- criteria.add(Restrictions.like(“goodsName”, frontGoodsQueryCriteria.getGoodsName().trim(), MatchMode.ANYWHERE));
- }
- // 查询条件物品状态
- if (frontGoodsQueryCriteria.getGoodsStatus() != null){
- criteria.add(Restrictions.like(“goodsStatus”,frontGoodsQueryCriteria.getGoodsStatus()));
- }
- // 查询条件物品是否在架
- if (frontGoodsQueryCriteria.getGoodsShelf() != null){
- criteria.add(Restrictions.like(“goodsShelf”,frontGoodsQueryCriteria.getGoodsShelf()));
- }
- if (frontGoodsQueryCriteria.getSortHelper() != null){
- if(frontGoodsQueryCriteria.getSortHelper().getSortedType().equals(“desc”))
- criteria.addOrder(Property.forName(frontGoodsQueryCriteria.getSortHelper().getColName()).desc());
- else
- criteria.addOrder(Property.forName(frontGoodsQueryCriteria.getSortHelper().getColName()).asc());
- }
- return criteria;
- }
映射文件photo.hbm.xml
[xhtml] view plaincopy
- <?xml version=”1.0″?>
- <!DOCTYPE hibernate-mapping PUBLIC ”-//Hibernate/Hibernate Mapping DTD 3.0//EN”
- “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>
- <!– Generated 2011-5-30 18:47:47 by Hibernate Tools 3.3.0.GA –>
- <hibernate-mapping package=”com.campus.back.model”>
- <class name=”Photo” table=”t_photo”>
- <id name=”photoId” type=”int”>
- <column name=”photo_id” />
- <generator class=”increment” />
- </id>
- <many-to-one name=”goods” class=”Goods” fetch=”select” lazy=”false”>
- <column name=”goods_id” />
- </many-to-one>
- <property name=”photoName” type=”string”>
- <column name=”photo_name” length=”50″ />
- </property>
- <property name=”photoCaption” type=”string”>
- <column name=”photo_caption” length=”50″ />
- </property>
- </class>
- </hibernate-mapping>
Photo.java
[java] view plaincopy
- public class Photo implements java.io.Serializable {
- private int photoId;
- private Goods goods;
- private String photoName;
- private String photoCaption;
- }
Goods.hbm.xml
[xhtml] view plaincopy
- <?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”>
- <!– Hibernate映射文件的根元素 –>
- <hibernate-mapping package=”com.campus.back.model”>
- <class name=”Goods” table=”t_goods”>
- <!– 映射标识属性 –>
- <id name=”goodsId” type=”string” column=”goods_id”>
- <!– 指定主键生成策略 –>
- <generator class=”assigned”/>
- </id>
- <!– 映射普通属性 –>
- <property name=”goodsName” column=”goods_name” type=”string”
- length=”60″ not-null=”false”/>
- <property name=”goodsNew” column=”goods_new” type=”string”
- length=”1″ />
- <property name=”goodsDetail” column=”goods_detail” type=”string”
- length=”65535″ />
- <property name=”goodsStatus” column=”goods_status” type=”string”
- length=”1″ not-null=”false”/>
- <property name=”goodsRegist”>
- <column name=”goods_regist” sql-type=”datetime”/>
- </property>
- <property name=”goodsValidity” column=”goods_validity” type=”string”
- length=”3″ />
- <property name=”goodsStart”>
- <column name=”goods_start” sql-type=”datetime”/>
- </property>
- <property name=”goodsEnd”>
- <column name=”goods_end” sql-type=”datetime”/>
- </property>
- <property name=”goodsShelf” column=”goods_shelf” type=”string”
- length=”1″ />
- <many-to-one name=”cate” class=”Cate” fetch=”select” lazy=”false”>
- <column name=”category_id”/>
- </many-to-one>
- <many-to-one name=”user” class=”User” fetch=”select” lazy=”false”>
- <column name=”user_id”/>
- </many-to-one>
- <set name=”photos” table=”t_photo” inverse=”true” lazy=”false” fetch=”select”>
- <key>
- <column name=”goods_id” not-null=”false” />
- </key>
- <one-to-many class=”Photo” />
- </set>
- </class>
- </hibernate-mapping>
Goods.java
[java] view plaincopy
- import java.util.Date;
- import java.util.HashSet;
- import java.util.Set;
- /**
- * @ClassName: Goods
- * @Description: TODO(定义持久化PO类,映射t_goods表)
- * @author neo-dong
- * @date 2011-4-10 下午09:06:47
- * @version v1.0
- *
- */
- public class Goods {
- /** 物品ID */
- private String goodsId;
- /** 物品名称 */
- private String goodsName;
- /** 物品新旧程度 */
- private String goodsNew;
- /** 物品详情 */
- private String goodsDetail;
- /** 物品状态 */
- private String goodsStatus;
- /** 物品登记日期 */
- private Date goodsRegist;
- /** 物品是否上架 */
- private String goodsShelf;
- /** 物品有效日期,自登记日期开始计算 */
- private String goodsValidity;
- /** 物品开始交换日期*/
- private Date goodsStart;
- /** 物品结束交换日期 */
- private Date goodsEnd;
- private Cate cate;
- private User user;
- private Set<Photo> photos = new HashSet<Photo>(0);
- }
实现分页功能的相关的类
Page.java
[java] view plaincopy
- package com.campus.common;
- import java.util.Collection;
- /**
- * @ClassName: Page
- * @Description: TODO(分页所需的类,一个javabean,包含所需的page属性)
- * @date 2011-4-8 下午09:00:20
- * @version v1.0
- *
- */
- public class Page {
- private Integer pageNo = new Integer(1); // 当前页号
- private Integer pageSize; // 每页记录条数
- private Collection content; // 本页记录集
- private Long totalRecNum; // 总记录条数
- // private Integer totalPageNum; // 总页面数量
- // private Boolean prePage; // 是否有上一页
- // private Boolean nextPage; // 是否有下一页
- // private Integer startIndex; // 本页记录开始编号
- // private Integer endIndex; // 本页记录结束编号
- public Page(Integer pageNo)
- {
- super();
- this.pageNo=pageNo;
- this.pageSize=10;
- }
- public Page()
- {
- this(new Integer(1));
- }
- public Integer getPageNo() {
- return pageNo;
- }
- public void setPageNo(Integer pageNo) {
- this.pageNo = pageNo;
- }
- public Integer getPageSize() {
- return pageSize;
- }
- public void setPageSize(Integer pageSize) {
- this.pageSize = pageSize;
- }
- public Collection getContent() {
- return content;
- }
- public void setContent(Collection content) {
- this.content = content;
- }
- public Long getTotalRecNum() {
- return totalRecNum;
- }
- public void setTotalRecNum(Long totalRecNum) {
- this.totalRecNum = totalRecNum;
- }
- public Integer getTotalPageNum() {
- return totalRecNum%pageSize!=0?(int)(totalRecNum/pageSize+1):(int)(totalRecNum/pageSize);
- }
- public Boolean getPrePage() {
- return pageNo>1;
- }
- public Boolean getNextPage() {
- return pageNo<this.getTotalPageNum();
- }
- public Long getStartIndex() {
- return 1L*pageSize*(pageNo-1)+1;
- }
- public Long getEndIndex() {
- return pageSize*pageNo>this.getTotalRecNum()?this.getTotalRecNum():pageSize*pageNo;
- }
- }
SortHelper.java
[java] view plaincopy
- /**
- * @ClassName: SortHelper
- * @Description: TODO(用于分页结果排序,决定根据哪列排序)
- * @date 2011-4-8 下午09:02:28
- * @version v1.0
- *
- */
- public class SortHelper {
- private Integer colIndex;
- private String colName;
- private String sortedType;
- public SortHelper() {
- }
- public SortHelper(String colName) {
- colIndex = 0;
- sortedType = ”asc”;
- this.colName = colName;
- }
- public Integer getColIndex() {
- return colIndex;
- }
- public void setColIndex(Integer colIndex) {
- this.colIndex = colIndex;
- }
- public String getColName() {
- return colName;
- }
- public void setColName(String colName) {
- this.colName = colName;
- }
- public String getSortedType() {
- return sortedType;
- }
- public void setSortedType(String sortedType) {
- this.sortedType = sortedType;
- }
- }
FrontGoodsQueryCriteria.java
[java] view plaincopy
- package com.campus.front.criteria;
- import java.util.Date;
- import com.campus.common.SortHelper;
- /**
- * @ClassName: FrontGoodsQueryCriteria
- * @Description: TODO(这里用一句话描述这个类的作用)
- * @date 2011-6-3 下午08:56:00
- * @version v1.0
- *
- */
- public class FrontGoodsQueryCriteria {
- private SortHelper sortHelper;
- /** 物品id*/
- private String goodsId;
- /** 物品名称 */
- private String goodsName;
- /** 物品状态 */
- private String goodsStatus;
- /** 物品登记日期 */
- private Date goodsRegist;
- /** 物品上架日期 */
- private String goodsShelf;
- /** 物品开始交换日期*/
- private Date goodsStart;
- /** 物品结束交换日期 */
- private Date goodsEnd;
- public FrontGoodsQueryCriteria(SortHelper sortHelper) {
- this.sortHelper = sortHelper;
- }
- public String getGoodsId() {
- return goodsId;
- }
- public void setGoodsId(String goodsId) {
- this.goodsId = goodsId;
- }
- public String getGoodsName() {
- return goodsName;
- }
- public void setGoodsName(String goodsName) {
- this.goodsName = goodsName;
- }
- public String getGoodsStatus() {
- return goodsStatus;
- }
- public void setGoodsStatus(String goodsStatus) {
- this.goodsStatus = goodsStatus;
- }
- public Date getGoodsRegist() {
- return goodsRegist;
- }
- public void setGoodsRegist(Date goodsRegist) {
- this.goodsRegist = goodsRegist;
- }
- public String getGoodsShelf() {
- return goodsShelf;
- }
- public void setGoodsShelf(String goodsShelf) {
- this.goodsShelf = goodsShelf;
- }
- public Date getGoodsStart() {
- return goodsStart;
- }
- public void setGoodsStart(Date goodsStart) {
- this.goodsStart = goodsStart;
- }
- public Date getGoodsEnd() {
- return goodsEnd;
- }
- public void setGoodsEnd(Date goodsEnd) {
- this.goodsEnd = goodsEnd;
- }
- public void setSortHelper(SortHelper sortHelper) {
- this.sortHelper = sortHelper;
- }
- public SortHelper getSortHelper() {
- return sortHelper;
- }
- }
提问者采纳
你不是已经做好映射了?直接取出就ok了. 你在product类中声明一个set类型的变量,存储类型为photo类型 在你的xxx.hib.xml中配置出这个<set>映射 然后在你查询product,调用里面的那个set变量,hibernate就会自动关联到photo表..
- 追问
-
做好了,也许会有点问题,刚才有报懒加载异常 问题说不清,能帮我看看代码吗 http://blog.csdn.net/neosmemory/archive/2011/06/10/6535968.aspx
- 回答
-
你的photo类写getter/setter了吗?
- 追问
-
这些getter setter的就不贴了好吧,占篇幅。
- 回答
-
你的<set>里的一对多:column列 对应的不是photo表中的goods_id外键吗?
- 追问
-
哦,谢谢你用心帮我,那里写错了,可页面上和action里怎么得到photoName
- 回答
-
你测试能运行出现结果吗? 你在action中是用lgoods来存储查询出的结果吗? 如果是的话,你在action中对lgoods进行getter/setter 然后在页面使用 <s:iterator value="lgoods"> //在这里调用action中的lgoods <s:property value ="goodsname"/> //这里是goods的goodsname属性 <s:iterator value="photos"> //这里是你goods类中的photos Set.从photos中获取photo对象 <s:property value="photoName"/> //photo中的photoname属性 </s:iterator> //在这里遍历 你的lgoods里面获取的 </s:iterator> 遍历. ------------- 其实你的dao类中的那个查询方法,可以直接使用一个万能查询方法..不用那么麻烦的.
- 追问
-
在action里可以拿到photoName了 action里用的是page存储查询结果 jsp页面里用<s:iterator value="page.content"></s:iterator>来显示,物品id的都能拿到 我想应该嵌套查photoName,可是嵌套的这个<s:iterator value=""></s:iterator> value里不知道写什么? 写photos不好使,写page.content.photos也不好使,这东西对photos对象这种set类型不管用吗?
- 回答
-
<s:iterator value="page.content"> //你的content中存放的是goods对象吧 //你不是可以直接使用<s:property value="goodsid"/>吗,那肯定也可以直接用到goods中photos. <s:iterator value="photos"> //那你直接遍历你的photos <s:property value="photoname"/> //在这直接显示你的photoname </s:iterator> </s:iterator>
- 追问
-
应该是这样吧<s:iterator value="page.content" id="test">然后<s:iterator value="#test.photos">不过不管用 后来再action里加了 private Set<Photo> photos = new HashSet<Photo>(0);和它的getter setter 然后给photos赋page里的值 页面就有photos了,然后用你那个iterator就行了 谢谢你,花这么久的时间帮我解答。
- 提问者评价
-
问题终于解决了,感谢update_all的耐心帮忙,女孩子就是热心,太感谢了。 也谢谢其它的朋友,