用spring+ibatis做了多表连接的例子,子查询始终查不出数据
一个类别下有很多产品,关系就这么简单
product.xml<sqlMap namespace="Product">
<typeAlias alias="product" type="org.bs.pojo.Product" />
<typeAlias alias="category" type="org.bs.pojo.Category" /> <resultMap class="category" id="categoryMap">
<result property="cid" column="cid" />
<result property="categoryName" column="categoryName" />
</resultMap>
<resultMap class="product" id="productMap">
<result property="pid" column="pid" />
<result property="productName" column="productName" />
<result property="author" column="author" />
<result property="price" column="price" />
<result property="publishTime" column="publishTime" />
<result property="descript" column="descript" />
<result property="imgSrc" column="imgSrc" />
<result property="re" column="re" />
<result property="category" column="cid" select="getCategoryById" />
</resultMap>
<select id="getCategoryById" resultClass="category"> 
select cid,categoryName from category
</select>
<select id="getAllProduct" resultClass="product">
select
*
from
product
</select>
</sqlMap>ProductDaoImpl.javapublic class ProductDaoImpl extends SqlMapClientDaoSupport implements
IProductDao {
public List<Product> getAllProduct() {
List<Product> listProduct = getSqlMapClientTemplate().queryForList(
"getAllProduct");
return listProduct;
}}test.javapublic void testProduct() {
IProductBiz u = (IProductBiz) GetBean.getBean("productBiz");
try {
List<Product> list = u.getAllProduct();
for (int i = 0; i < list.size(); i++) {
Product p = list.get(i);
System.out.println(p.getProductName()+ p.getCategory().getCategoryName());
}
} catch (Exception e) {
e.printStackTrace();
}
}输出了产品名称,但是类别名称是null 
希望这次别让我失望了,发了两次贴了,分也加倍了

解决方案 »

  1.   

    当然是null, 又不是hibernate, 可以对象映射,ibatis是sql映射
    连表查吧
      

  2.   

    不是说ibatis可以在resultMap 中定义嵌套查询getCategoryById,实现了关联
    数据的读取么?难道不可以
      

  3.   

       <resultMap class="category" id="categoryMap">
            <result property="cid" column="cid" />
            <result property="categoryName" column="categoryName" />
        </resultMap>
    column对应的是数据库的字段名property 对应实体的属性的对应好了就不是null了
      

  4.   

    1.虽然你做了resultMap映射,但是在最后查询语句中
     <select id="getAllProduct" resultClass="product">
    这里应该用
     <select id="getAllProduct" resultMap="productMap">
    ?2.在id为getCategoryById的查询中,你查询了cid和categoryName,
    而在resultMap中却将其映射到category一个属性中,我不知道你的category属性是否是一个对象还是
    普通的String类型,如果是普通的String类型的话,个人觉得这样会出问题。
      

  5.   

    <select id="getAllProduct" resultClass="product">
            select
            *
            from
            product
        </select>看看你的字段是否和product完全匹配,大小写、等,不匹配的,找不到值
      

  6.   

    都比较了没问题,我都是从数据库中copy过来的。我已经发了3次留言了 不能发了 怎么办呀?
      

  7.   

     <select id="getCategoryById" resultClass="category"> 
            select cid,categoryName from category
        </select>
        <select id="getAllProduct" resultClass="product">        select
            *
            from
            product
        </select>
    resultClass 应该是resultMap
    返回的类型是你的map映射的categoryMap, productMap
      

  8.   

    public class ProductDaoImpl extends SqlMapClientDaoSupport implements
            IProductDao {
        public List<Product> getAllProduct() {
            List<Product> listProduct = getSqlMapClientTemplate().queryForList(
                    "getAllProduct");
            return listProduct;
        }}
    这里只是执行了<select id="getAllProduct" resultClass="product">
    这条语句,没有调用getCategoryById,当然是null了,另外6楼说的也要检查一下,要对应。
      

  9.   

    我看看你的数据表结构和domain对象
      

  10.   

    public class Product{  
        private int pid;  
        private String productName;  
        private String author;  
        private double price;  
        private Date publishTime;  
        private String descript;  
        private String imgSrc;  
        private String re;  
        private Category category = new Category();  
      
        public int getPid() {  
            return pid;  
        }  
      
        public void setPid(int pid) {  
            this.pid = pid;  
        }  
      
        public String getProductName() {  
            return productName;  
        }  
      
        public void setProductName(String productName) {  
            this.productName = productName;  
        }  
      
        public String getAuthor() {  
            return author;  
        }  
      
        public void setAuthor(String author) {  
            this.author = author;  
        }  
      
        public double getPrice() {  
            return price;  
        }  
      
        public void setPrice(double price) {  
            this.price = price;  
        }  
      
        public Date getPublishTime() {  
            return publishTime;  
        }  
      
        public void setPublishTime(Date publishTime) {  
            this.publishTime = publishTime;  
        }  
      
        public String getDescript() {  
            return descript;  
        }  
      
        public void setDescript(String descript) {  
            this.descript = descript;  
        }  
      
        public String getImgSrc() {  
            return imgSrc;  
        }  
      
        public void setImgSrc(String imgSrc) {  
            this.imgSrc = imgSrc;  
        }  
      
        public String getRe() {  
            return re;  
        }  
      
        public void setRe(String re) {  
            this.re = re;  
        }  
      
        public Category getCategory() {  
            return category;  
        }  
        public void setCategory(Category category) {  
            this.category = category;  
        }  
    }  我晕啦,看完你的domain,ibatis是不支持级联查询的,如果你想查询p.getCategory().getCid()); 下的Category 只能用两个表关联的方式,而且你可以在Product自己定义些属性,来接收两表关联后Category的列,若:
    增加private String categoryName,
    get,set方法。
    sqlmap中:
    select
    Category  . categoryName categoryName
     from Product, Category  where  a....这样在获取Product对象的时候也就得到categoryName的值啦