现在我想把一个数据库表里的数据取出来。
数据库表TSALE的定义如下:
字段:id, depart, prop_code, product_id
字段id是主键,自动递增。
depart是部门id,prop_code是产品编码,product_id是具体一个产品的id,一种产品编码(prop_code)对应有很多产品,也就是对应很多product_id。现在我想将depart, prop_code, product_id取出,
将他们用对象关联起来。
depart存放在 DepartBean 类里,
SELECT DEPART FROM TSALE GROUP BY DEPART,
取出这个表里所有的DEPART。DepartBean 里还有一个List<PropBean> propList成员变量。存放的就是 用 SELECT PROP_CODE FROM TSALE WHERE DEPART = #depart# GROUP BY PROP_CODE 。
取出一个部门有的产品种类。PropBean 里有一个List<String> productList成员变量。
存放product_id。
SELECT PRODUCT_ID FROM TSALE WHERE PROP_CODE = #propCode# AND DEPART = #depart#
现在我想用resultMap定义一个复杂类型,直接将这表里的关系都取出来。请大家看一下,最好能按照现在的内容写代码。谢谢了。

解决方案 »

  1.   

    <!-- 用户管理与用户授权合并ResultMap -->
    <resultMap id="CongenerUserResult" class="user">
    <result property="id" column="USER_ID"  jdbcType="NUMBER" nullValue="0"/>
    <result property="name" column="USER_NAME" nullValue=""/>
    <result property="roles" column="USER_ID" select="user.selectedRoles" />
    </resultMap>
    这种方式用过吗?查询user的时候用user_id关联到角色表,将该用户的所有角色查询出来。
      

  2.   

    我用的是这种:
    <resultMap id="get-saleInfo-header" class="com.linkage.ess.ejb.ipm.ipm.po.SaleInfoHeader"> 
    <result property="departId" column="DEPART_ID"/>
    <result property="bodyList" column="DEPART_ID" select="getBodyByDepartId" />
    </resultMap>

    <select id="SI_selSaleInfo"  resultClass="get-saleInfo-header">
        <![CDATA[
    SELECT 
    DEPART_ID 
    FROM 
    TF_R_TERMINAL_SALETRADE_DTL 
    GROUP BY 
    DEPART_ID
     ]]>
    </select>
    <resultMap id="get-saleInfo-body" class="com.linkage.ess.ejb.ipm.ipm.po.SaleInfoBody">
    <result property="propId" column="PROP_ID"/>
    </resultMap>

    <statement id="getBodyByDepartId" parameterClass="String" resultMap="get-saleInfo-body">
         <![CDATA[
         SELECT 
         PROP_ID 
         FROM 
         TF_R_TERMINAL_SALETRADE_DTL 
         WHERE 
         DEPART_ID = #DEPART_ID# 
         GROUP BY 
         PROP_ID
         ]]>
    </statement> 这样用了,但有异常。
    我现在想知道怎么设置这些关系。
      

  3.   

    这两个查询时在同一个SqlMap里边吗?异常信息是什么?
      

  4.   

    楼主的方法是可行的。楼主在2楼的这句:<result property="bodyList" column="DEPART_ID" select="getBodyByDepartId" />这里的column需要用你JAVA类里的名称,而不是数据库列名,因为这个属性没有和数据库关联,而是使用Java类里的一个属性--我猜应该命名为departId--来当做一个parameter输入到getBodyByDepartId这个SQL里进行查找。
      

  5.   

    看看这两个地方<select id="SI_selSaleInfo"  resultClass="get-saleInfo-header">
    用resultMap=’get-saleInfo-header‘<statement id="getBodyByDepartId" parameterClass="String" resultMap="get-saleInfo-body">
    把statement改成select
      

  6.   


    Exception in thread "main" java.lang.RuntimeException: Error occurred.  Cause: com.ibatis.common.xml.NodeletException: Error parsing XML.  Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/sqlMap'.  Cause: com.ibatis.common.xml.NodeletException: Error parsing XML.  Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMap/select'.  Cause: com.ibatis.sqlmap.client.SqlMapException: Error.  Could not initialize class.  Cause: java.lang.ClassNotFoundException: get-saleInfo-header
    at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:49)
    at com.ibatis.sqlmap.client.SqlMapClientBuilder.buildSqlMapClient(SqlMapClientBuilder.java:63)
    at com.linkage.base.ibatis.IbatisHelper.LoadResource(IbatisHelper.java:48)
    at com.linkage.base.dao.BaseDao.LoadResource(BaseDao.java:18)
    at com.linkage.ess.ejb.ipm.base.dao.ProvinceDao.LoadResource(ProvinceDao.java:10)
    at com.linkage.ess.ejb.ipm.ipm.service.SI_SaleInfoSrv.<init>(SI_SaleInfoSrv.java:27)
    at com.linkage.ess.ejb.ipm.ipm.service.SI_SaleInfoSrv.main(SI_SaleInfoSrv.java:45)
    Caused by: com.ibatis.common.xml.NodeletException: Error parsing XML.  Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/sqlMap'.  Cause: com.ibatis.common.xml.NodeletException: Error parsing XML.  Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMap/select'.  Cause: com.ibatis.sqlmap.client.SqlMapException: Error.  Could not initialize class.  Cause: java.lang.ClassNotFoundException: get-saleInfo-header
    at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:53)
    at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:46)
    ... 6 more
    Caused by: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/sqlMap'.  Cause: com.ibatis.common.xml.NodeletException: Error parsing XML.  Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMap/select'.  Cause: com.ibatis.sqlmap.client.SqlMapException: Error.  Could not initialize class.  Cause: java.lang.ClassNotFoundException: get-saleInfo-header
    at com.ibatis.common.xml.NodeletParser.processNodelet(NodeletParser.java:123)
    at com.ibatis.common.xml.NodeletParser.process(NodeletParser.java:84)
    at com.ibatis.common.xml.NodeletParser.process(NodeletParser.java:102)
    at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:72)
    at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:51)
    ... 7 more
    Caused by: com.ibatis.common.xml.NodeletException: Error parsing XML.  Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMap/select'.  Cause: com.ibatis.sqlmap.client.SqlMapException: Error.  Could not initialize class.  Cause: java.lang.ClassNotFoundException: get-saleInfo-header
    at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:53)
    at com.ibatis.sqlmap.engine.builder.xml.SqlMapParser.parse(SqlMapParser.java:40)
    at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser$10.process(SqlMapConfigParser.java:270)
    at com.ibatis.common.xml.NodeletParser.processNodelet(NodeletParser.java:121)
    ... 11 more
    Caused by: java.lang.RuntimeException: Error parsing XPath '/sqlMap/select'.  Cause: com.ibatis.sqlmap.client.SqlMapException: Error.  Could not initialize class.  Cause: java.lang.ClassNotFoundException: get-saleInfo-header
    at com.ibatis.common.xml.NodeletParser.processNodelet(NodeletParser.java:123)
    at com.ibatis.common.xml.NodeletParser.process(NodeletParser.java:84)
    at com.ibatis.common.xml.NodeletParser.process(NodeletParser.java:102)
    at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:72)
    at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:51)
    ... 14 more
    Caused by: com.ibatis.sqlmap.client.SqlMapException: Error.  Could not initialize class.  Cause: java.lang.ClassNotFoundException: get-saleInfo-header
    at com.ibatis.sqlmap.engine.builder.xml.SqlStatementParser.resolveClass(SqlStatementParser.java:89)
    at com.ibatis.sqlmap.engine.builder.xml.SqlStatementParser.parseGeneralStatement(SqlStatementParser.java:67)
    at com.ibatis.sqlmap.engine.builder.xml.SqlMapParser$21.process(SqlMapParser.java:362)
    at com.ibatis.common.xml.NodeletParser.processNodelet(NodeletParser.java:121)
    ... 18 more
    Caused by: java.lang.ClassNotFoundException: get-saleInfo-header
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:169)
    at com.ibatis.common.resources.Resources.classForName(Resources.java:267)
    at com.ibatis.sqlmap.engine.builder.xml.SqlStatementParser.resolveClass(SqlStatementParser.java:84)
    ... 21 more帮搞一下,急。
      

  7.   

    你的XML文件里面可能有东西没用上,或者写错了什么。
      

  8.   


    应该是我在8楼分析的,你用的是resultClass来指向一个ResultMap,当然不对,应该用resultMap
      

  9.   

    8楼分析的是一个问题。
    还有就是 resultMap 要写在引用到它的地方的前面,也就是向上引用。
    谢谢各位。
    今天一早问题就解决了。