hibernate 一对多 分页 criteria 查询

本文展示了如何在Hibernate中利用Criteria API进行一对多关联查询,并结合分页功能,实现在Web表单中展示商品信息。通过隐藏字段设置排序方式和当前页数,迭代器遍历页面内容,显示商品ID、名称和图片链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Goods物品表,photo物品照片表,一个物品对应5张照片

双向关联映射已经做好了,查goods的时候用的criteria条件查询

怎么在查 所有的 goods的时候,同时把每个goods对应的一张photo也查出来 ?
贴代码了,太多了,不爱看的不看吧,高手们帮我看一下,我应该怎么写代码,才能在后台和页面取得photoName。
就是html代码部分我要<img src='../images/<s:property value="photos"/>拿到photoName,这里怎么改才能正确显示图片,怎么做呢?
问题已经解决,更新代码了。
html代码

 
[xhtml] view plain copy
  1. <form id="searchForm" name="searchForm" action="retrieveGoodsAction_retrieveAllGoods">  
  2.             <s:hidden name="frontGoodsQueryCriteria.sortHelper.colIndex" id="index" value="0"></s:hidden>   
  3.             <s:hidden name="frontGoodsQueryCriteria.sortHelper.colName" id="colName" value="goodsId"></s:hidden>  
  4.             <s:hidden name="frontGoodsQueryCriteria.sortHelper.sortedType" id="colType" value="asc"></s:hidden>  
  5. <s:hidden name="page.pageNo" value="1"></s:hidden>  
  6.   
  7. 省略提交按钮  
  8. <s:iterator value="page.content"  id="l">   
  9.                                   
  10.                             <li> 0  
  11.                                 <div class="pro_disp pro_104px">  
  12.                                     <a href='retrieveGoodsAction_retrieveGoodsById?goodsId=<s:property value="goodsId"></a>' target="_blank">  
  13.                                         <img src='../imagesGoods/<s:iterator value="photos"><s:property value="photoName"/></s:iterator>' alt="图片不正确" />  
  14.                                     </a>  
  15.                                 </div>   
  16.                                 <b class="p_overflow">  
  17.                                     <a href='retrieveGoodsAction_retrieveGoodsById?goodsId=<s:property value="goodsId"></a>' target="_blank" title='<s:property value="goodsName"/>'>  
  18.                                         <s:property value="goodsName"/>  
  19.                                     </a>  
  20.                                 </b>   
  21.                           
  22.                               
  23.                             </li>  
  24.                               
  25.                         </s:iterator>  
  26. </form>  
action代码

 
[java] view plain copy
  1. public class RetrieveGoodsAction extends BaseAction{  
  2.       
  3.     private Integer cateId;  
  4.     private Integer goodsId;  
  5.       
  6.     private List<Goods> lgoods;  
  7.     private Set<Photo> photos = new HashSet<Photo>(0);  
  8.       
  9.       
  10.     // 创建page对象,保存分页信息  
  11.     Page page = new Page();  
  12.     // 创建查询条件,接收页面的adminName,adminDesc,并默认根据adminID排序  
  13.     private GoodsQueryCriteria frontGoodsQueryCriteria=   
  14.         new GoodsQueryCriteria(new SortHelper("goodsId"));//默认排序ID  
  15.     /**  
  16.     * @Title: retrieveAllGoods 
  17.     * @Description: (分页查询所有物品,显示在首页上)  
  18.     * @return String error or success  
  19.     * @throws Exception 
  20.     */  
  21.     public String retrieveAllGoods() throws Exception{  
  22.           
  23.         page = fgmi.goodsInfoByPage(page, frontGoodsQueryCriteria);  
  24.         Iterator itr = page.getContent().iterator();  
  25.         while(itr.hasNext()){  
  26.             Goods goods = (Goods) itr.next();  
  27.             photos = goods.getPhotos();  
  28.             System.out.println( "物品名称:" + goods.getGoodsName());  
  29.             Iterator it = goods.getPhotos().iterator();  
  30.             while(it.hasNext()){  
  31.                 Photo ph =(Photo)it.next();  
  32.                 System.out.println("图片名:" + ph.getPhotoName());  
  33.             }  
  34.             //setPhotos(goods.getPhotos());  
  35.             System.out.println("---------111++++++++==");  
  36.         }  
  37.         if(page != null){         
  38.             return "retrieveSuccess";  
  39.         }  
  40.         return ERROR;  
  41.     }  
  42.       
  43.     public Integer getCateId() {  
  44.         return cateId;  
  45.     }  
  46.     public void setCateId(Integer cateId) {  
  47.         this.cateId = cateId;  
  48.     }  
  49.     public Integer getGoodsId() {  
  50.         return goodsId;  
  51.     }  
  52.     public void setGoodsId(Integer goodsId) {  
  53.         this.goodsId = goodsId;  
  54.     }  
  55.     public List<Goods> getLgoods() {  
  56.         return lgoods;  
  57.     }  
  58.     public void setLgoods(List<Goods> lgoods) {  
  59.         this.lgoods = lgoods;  
  60.     }  
  61.   
  62.     public Page getPage() {  
  63.         return page;  
  64.     }  
  65.   
  66.     public void setPage(Page page) {  
  67.         this.page = page;  
  68.     }  
  69.   
  70.     public GoodsQueryCriteria getFrontGoodsQueryCriteria() {  
  71.         return frontGoodsQueryCriteria;  
  72.     }  
  73.   
  74.     public void setFrontGoodsQueryCriteria(  
  75.             GoodsQueryCriteria frontGoodsQueryCriteria) {  
  76.         this.frontGoodsQueryCriteria = frontGoodsQueryCriteria;  
  77.     }  
  78.   
  79.     public Set<Photo> getPhotos() {  
  80.         return photos;  
  81.     }  
  82.   
  83.     public void setPhotos(Set<Photo> photos) {  
  84.         this.photos = photos;  
  85.     }  
  86.       
  87.       
  88. }  
ManagerImpl里的方法
 
[java] view plain copy
  1. /**  
  2.     * @Title: goodsInfoByPage 
  3.     * @Description: (分页查询)  
  4.     * @param  page  Page对象 
  5.     * @param  goodsQueryCriteria 查询条件 
  6.     * @return page Page对象 
  7.     * @throws CampusException 
  8.     */  
  9.     public Page goodsInfoByPage(Page page, GoodsQueryCriteria frontGoodsQueryCriteria) throws CampusException {  
  10.         try{  
  11.             page.setTotalRecNum(new Long(frontGoodsDao.queryGoodsTotal(frontGoodsQueryCriteria)));  
  12.           
  13.             page.setContent(frontGoodsDao.queryGoodsByPage(page.getStartIndex().intValue(), page  
  14.                 .getPageSize(), frontGoodsQueryCriteria));  
  15.           
  16.             return page;  
  17.         }catch (Exception e){  
  18.             e.printStackTrace();  
  19.             //log.debug(e.getMessage());  
  20.             throw new CampusException();  
  21.         }  
  22.     }  
dao代码
 
[java] view plain copy
  1. /** 
  2.      * @Title: queryGoodsByPage 
  3.      * @Description: (分页查询符合条件的Goods实例) 
  4.      * @param startIndex 当前页面显示的第一条记录的索引 
  5.      * @param fetchSize  页面显示的条数 
  6.      * @param frontGoodsQueryCriteria 查询条件 
  7.      * @return  符合条件的Goods实例 
  8.      * @throws  
  9.      */  
  10.     public List<Goods> queryGoodsByPage(int startIndex, int fetchSize, GoodsQueryCriteria frontGoodsQueryCriteria) {  
  11.           
  12.         DetachedCriteria criteria=this.buildCriteria(frontGoodsQueryCriteria);  
  13.           
  14.         List<Goods> goods = this.getHibernateTemplate().findByCriteria(criteria, startIndex - 1, fetchSize);  
  15.           
  16.         return goods;  
  17.     }  
  18.       
  19.     /**  
  20.     * @Title: queryGoodsTotal 
  21.     * @Description: (查询符合条件的Goods实例记录数)  
  22.     * @param  frontGoodsQueryCriteria 查询条件 
  23.     * @return integer,符合条件的数目 
  24.     * @throws  
  25.     */  
  26.     public Integer queryGoodsTotal(GoodsQueryCriteria frontGoodsQueryCriteria){  
  27.           
  28.         DetachedCriteria criteria=this.buildCriteria(frontGoodsQueryCriteria);  
  29.           
  30.         criteria.setProjection(Projections.rowCount());  
  31.           
  32.         return (Integer)this.getHibernateTemplate().findByCriteria(criteria).get(0);  
  33.           
  34.     }  
  35.       
  36.     /** 
  37.      * @Title: buildCriteria 
  38.      * @Description: (创建hibernate查询条件,完成多条件查询功能) 
  39.      * @param frontGoodsQueryCriteria 查询条件 
  40.      * @return  符合条件的DetachedCriteria实例 
  41.      * @throws  
  42.      */  
  43.       
  44.     private DetachedCriteria buildCriteria(GoodsQueryCriteria frontGoodsQueryCriteria)  
  45.     {  
  46.         DetachedCriteria criteria=DetachedCriteria.forClass(Goods.class);  
  47.         // 查询条件物品Id  
  48.         if (frontGoodsQueryCriteria.getGoodsId() != null){  
  49.             criteria.add(Restrictions.like("goodsId",frontGoodsQueryCriteria.getGoodsId().trim(), MatchMode.ANYWHERE));  
  50.         }  
  51.         // 查询条件物品名称  
  52.         if (StringUtils.isNotEmpty(frontGoodsQueryCriteria.getGoodsName())){  
  53.             criteria.add(Restrictions.like("goodsName", frontGoodsQueryCriteria.getGoodsName().trim(), MatchMode.ANYWHERE));  
  54.         }  
  55.         // 查询条件物品状态  
  56.         if (frontGoodsQueryCriteria.getGoodsStatus() != null){  
  57.             criteria.add(Restrictions.like("goodsStatus",frontGoodsQueryCriteria.getGoodsStatus()));  
  58.         }  
  59.         // 查询条件物品是否在架  
  60.         if (frontGoodsQueryCriteria.getGoodsShelf() != null){  
  61.             criteria.add(Restrictions.like("goodsShelf",frontGoodsQueryCriteria.getGoodsShelf()));  
  62.         }  
  63.         if (frontGoodsQueryCriteria.getSortHelper() != null){  
  64.             if(frontGoodsQueryCriteria.getSortHelper().getSortedType().equals("desc"))  
  65.                   
  66.                    criteria.addOrder(Property.forName(frontGoodsQueryCriteria.getSortHelper().getColName()).desc());  
  67.                 else  
  68.                    criteria.addOrder(Property.forName(frontGoodsQueryCriteria.getSortHelper().getColName()).asc());   
  69.             }  
  70.         return criteria;  
  71.     }  
映射文件photo.hbm.xml
 
[xhtml] view plain copy
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  4. <!-- Generated 2011-5-30 18:47:47 by Hibernate Tools 3.3.0.GA -->  
  5. <hibernate-mapping  package="com.campus.back.model">  
  6.     <class name="Photo" table="t_photo">  
  7.         <id name="photoId" type="int">  
  8.             <column name="photo_id" />  
  9.             <generator class="increment" />  
  10.         </id>  
  11.         <many-to-one name="goods" class="Goods" fetch="select" lazy="false">  
  12.             <column name="goods_id" />  
  13.         </many-to-one>  
  14.         <property name="photoName" type="string">  
  15.             <column name="photo_name" length="50" />  
  16.         </property>  
  17.         <property name="photoCaption" type="string">  
  18.             <column name="photo_caption" length="50" />  
  19.         </property>  
  20.     </class>  
  21. </hibernate-mapping>  
Photo.java
 
[java] view plain copy
  1. public class Photo implements java.io.Serializable {  
  2.   
  3.     private int photoId;  
  4.     private Goods goods;  
  5.     private String photoName;  
  6.     private String photoCaption;  
  7.   
  8. }  
Goods.hbm.xml

 
[xhtml] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping  
  3.     PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <!-- Hibernate映射文件的根元素 -->  
  6. <hibernate-mapping package="com.campus.back.model">  
  7.     <class name="Goods" table="t_goods">  
  8.         <!-- 映射标识属性 -->  
  9.         <id  name="goodsId" type="string" column="goods_id">  
  10.             <!-- 指定主键生成策略 -->  
  11.             <generator class="assigned"/>  
  12.         </id>  
  13.         <!-- 映射普通属性 -->  
  14.         <property name="goodsName" column="goods_name" type="string"  
  15.              length="60" not-null="false"/>  
  16.         <property name="goodsNew" column="goods_new" type="string"  
  17.              length="1" />  
  18.         <property name="goodsDetail" column="goods_detail" type="string"  
  19.              length="65535" />  
  20.         <property name="goodsStatus" column="goods_status" type="string"  
  21.              length="1" not-null="false"/>  
  22.         <property name="goodsRegist">  
  23.             <column name="goods_regist" sql-type="datetime"/>  
  24.         </property>  
  25.         <property name="goodsValidity" column="goods_validity" type="string"  
  26.              length="3" />  
  27.         <property name="goodsStart">  
  28.              <column name="goods_start" sql-type="datetime"/>  
  29.         </property>  
  30.         <property name="goodsEnd">  
  31.             <column name="goods_end" sql-type="datetime"/>  
  32.         </property>         
  33.         <property name="goodsShelf" column="goods_shelf" type="string"  
  34.              length="1" />  
  35.         <many-to-one name="cate" class="Cate" fetch="select" lazy="false">  
  36.             <column name="category_id"/>  
  37.         </many-to-one>  
  38.         <many-to-one name="user" class="User" fetch="select" lazy="false">  
  39.             <column name="user_id"/>  
  40.         </many-to-one>  
  41.         <set name="photos" table="t_photo" inverse="true" lazy="false" fetch="select">  
  42.             <key>  
  43.                 <column name="goods_id" not-null="false" />  
  44.             </key>  
  45.             <one-to-many class="Photo" />  
  46.         </set>  
  47.     </class>  
  48. </hibernate-mapping>  
Goods.java
 
[java] view plain copy
  1. import java.util.Date;  
  2. import java.util.HashSet;  
  3. import java.util.Set;  
  4.   
  5. /**  
  6.  * @ClassName: Goods  
  7.  * @Description: TODO(定义持久化PO类,映射t_goods表)  
  8.  * @author neo-dong  
  9.  * @date 2011-4-10 下午09:06:47  
  10.  * @version v1.0 
  11.  *   
  12.  */  
  13. public class Goods {  
  14.     /** 物品ID */  
  15.     private String goodsId;  
  16.     /** 物品名称 */  
  17.     private String goodsName;  
  18.     /** 物品新旧程度  */  
  19.     private String goodsNew;  
  20.     /** 物品详情 */  
  21.     private String goodsDetail;  
  22.     /** 物品状态 */  
  23.     private String goodsStatus;  
  24.     /** 物品登记日期 */  
  25.     private Date goodsRegist;  
  26.     /** 物品是否上架 */  
  27.     private String goodsShelf;  
  28.     /** 物品有效日期,自登记日期开始计算 */  
  29.     private String goodsValidity;  
  30.     /** 物品开始交换日期*/  
  31.     private Date goodsStart;  
  32.     /** 物品结束交换日期 */  
  33.     private Date goodsEnd;  
  34.       
  35.     private Cate cate;  
  36.     private User user;  
  37.       
  38.     private Set<Photo> photos = new HashSet<Photo>(0);  
  39. }  
实现分页功能的相关的类
Page.java
 
[java] view plain copy
  1. package com.campus.common;  
  2.   
  3. import java.util.Collection;  
  4.   
  5. /**  
  6.  * @ClassName: Page  
  7.  * @Description: TODO(分页所需的类,一个javabean,包含所需的page属性)  
  8.  * @date 2011-4-8 下午09:00:20  
  9.  * @version v1.0 
  10.  *   
  11.  */  
  12.   
  13. public class Page {  
  14.   
  15.     private Integer pageNo = new Integer(1); // 当前页号  
  16.     private Integer pageSize; // 每页记录条数  
  17.     private Collection content; // 本页记录集  
  18.     private Long totalRecNum; // 总记录条数  
  19. //  private Integer totalPageNum; // 总页面数量  
  20. //  private Boolean prePage; // 是否有上一页  
  21. //  private Boolean nextPage; // 是否有下一页  
  22. //  private Integer startIndex; // 本页记录开始编号  
  23. //  private Integer endIndex; // 本页记录结束编号  
  24.       
  25.     public Page(Integer pageNo)  
  26.     {  
  27.         super();  
  28.         this.pageNo=pageNo;  
  29.         this.pageSize=10;  
  30.     }  
  31.       
  32.     public Page()  
  33.     {  
  34.         this(new Integer(1));  
  35.     }  
  36.   
  37.     public Integer getPageNo() {  
  38.         return pageNo;  
  39.     }  
  40.   
  41.     public void setPageNo(Integer pageNo) {  
  42.         this.pageNo = pageNo;  
  43.     }  
  44.   
  45.     public Integer getPageSize() {  
  46.         return pageSize;  
  47.     }  
  48.   
  49.     public void setPageSize(Integer pageSize) {  
  50.         this.pageSize = pageSize;  
  51.     }  
  52.   
  53.     public Collection getContent() {  
  54.         return content;  
  55.     }  
  56.   
  57.     public void setContent(Collection content) {  
  58.         this.content = content;  
  59.     }  
  60.   
  61.     public Long getTotalRecNum() {  
  62.         return totalRecNum;  
  63.     }  
  64.   
  65.     public void setTotalRecNum(Long totalRecNum) {  
  66.         this.totalRecNum = totalRecNum;  
  67.     }  
  68.   
  69.     public Integer getTotalPageNum() {  
  70.         return totalRecNum%pageSize!=0?(int)(totalRecNum/pageSize+1):(int)(totalRecNum/pageSize);  
  71.     }  
  72.   
  73.     public Boolean getPrePage() {  
  74.         return pageNo>1;  
  75.     }  
  76.   
  77.     public Boolean getNextPage() {  
  78.         return pageNo<this.getTotalPageNum();  
  79.     }  
  80.   
  81.     public Long getStartIndex() {  
  82.         return 1L*pageSize*(pageNo-1)+1;  
  83.     }  
  84.   
  85.     public Long getEndIndex() {  
  86.         return pageSize*pageNo>this.getTotalRecNum()?this.getTotalRecNum():pageSize*pageNo;  
  87.     }  
  88.   
  89.   
  90. }  
SortHelper.java
 
[java] view plain copy
  1. /**  
  2.  * @ClassName: SortHelper  
  3.  * @Description: TODO(用于分页结果排序,决定根据哪列排序)  
  4.  * @date 2011-4-8 下午09:02:28  
  5.  * @version v1.0 
  6.  *   
  7.  */  
  8. public class SortHelper {  
  9.       
  10.     private Integer colIndex;  
  11.     private String colName;  
  12.     private String sortedType;  
  13.   
  14.     public SortHelper() {  
  15.   
  16.     }  
  17.       
  18.     public SortHelper(String colName) {  
  19.         colIndex = 0;  
  20.         sortedType = "asc";  
  21.         this.colName = colName;  
  22.     }  
  23.     public Integer getColIndex() {  
  24.         return colIndex;  
  25.     }  
  26.     public void setColIndex(Integer colIndex) {  
  27.         this.colIndex = colIndex;  
  28.     }  
  29.     public String getColName() {  
  30.         return colName;  
  31.     }  
  32.     public void setColName(String colName) {  
  33.         this.colName = colName;  
  34.     }  
  35.     public String getSortedType() {  
  36.         return sortedType;  
  37.     }  
  38.     public void setSortedType(String sortedType) {  
  39.         this.sortedType = sortedType;  
  40.     }  
  41.       
  42.   
  43. }  
FrontGoodsQueryCriteria.java
 
[java] view plain copy
  1. package com.campus.front.criteria;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import com.campus.common.SortHelper;  
  6.   
  7. /**  
  8.  * @ClassName: FrontGoodsQueryCriteria  
  9.  * @Description: TODO(这里用一句话描述这个类的作用)  
  10.  * @date 2011-6-3 下午08:56:00  
  11.  * @version v1.0 
  12.  *   
  13.  */  
  14. public class FrontGoodsQueryCriteria {  
  15.     private SortHelper sortHelper;  
  16.     /** 物品id*/  
  17.     private String goodsId;  
  18.     /** 物品名称 */  
  19.     private String goodsName;  
  20.     /** 物品状态 */  
  21.     private String goodsStatus;  
  22.     /** 物品登记日期 */  
  23.     private Date goodsRegist;  
  24.     /** 物品上架日期 */  
  25.     private String goodsShelf;  
  26.     /** 物品开始交换日期*/  
  27.     private Date goodsStart;  
  28.     /** 物品结束交换日期 */  
  29.     private Date goodsEnd;  
  30.       
  31.   
  32.     public FrontGoodsQueryCriteria(SortHelper sortHelper) {  
  33.         this.sortHelper = sortHelper;  
  34.     }  
  35.       
  36.     public String getGoodsId() {  
  37.         return goodsId;  
  38.     }  
  39.     public void setGoodsId(String goodsId) {  
  40.         this.goodsId = goodsId;  
  41.     }  
  42.     public String getGoodsName() {  
  43.         return goodsName;  
  44.     }  
  45.     public void setGoodsName(String goodsName) {  
  46.         this.goodsName = goodsName;  
  47.     }  
  48.     public String getGoodsStatus() {  
  49.         return goodsStatus;  
  50.     }  
  51.     public void setGoodsStatus(String goodsStatus) {  
  52.         this.goodsStatus = goodsStatus;  
  53.     }  
  54.     public Date getGoodsRegist() {  
  55.         return goodsRegist;  
  56.     }  
  57.     public void setGoodsRegist(Date goodsRegist) {  
  58.         this.goodsRegist = goodsRegist;  
  59.     }  
  60.     public String getGoodsShelf() {  
  61.         return goodsShelf;  
  62.     }  
  63.     public void setGoodsShelf(String goodsShelf) {  
  64.         this.goodsShelf = goodsShelf;  
  65.     }  
  66.     public Date getGoodsStart() {  
  67.         return goodsStart;  
  68.     }  
  69.     public void setGoodsStart(Date goodsStart) {  
  70.         this.goodsStart = goodsStart;  
  71.     }  
  72.     public Date getGoodsEnd() {  
  73.         return goodsEnd;  
  74.     }  
  75.     public void setGoodsEnd(Date goodsEnd) {  
  76.         this.goodsEnd = goodsEnd;  
  77.     }  
  78.     public void setSortHelper(SortHelper sortHelper) {  
  79.         this.sortHelper = sortHelper;  
  80.     }  
  81.     public SortHelper getSortHelper() {  
  82.         return sortHelper;  
  83.     }  
  84. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值