现在有两张表。
T_Main 表,ItemNo字段为主键、MsgDate、Desc等说明字段。
T_Dtl表是T_Main表的字表。
T_Dtl表的主键为ItemNo和Product_code,
这个Product_code是一个产品的编号,标志着一个具体产品。
另外T_Dtl表还有Product_Type字段,Product_Price字段,Product_Type是产品的种类,Product_Price是产品的价格。
一种产品对应一个价格。我现在想这样做。一个MainPo类,包括ItemNo、MsgDate、Desc等成员变量,
另外加一个List<DtlPo> dtls成员变量,这个成员变量标识主表与子表产品种类的一对多关系。DtlPo类包括Price、Type成员变量,还包括List<String> codes成员变量,
标识一个ItemNo,一种产品(Product_Type)包括哪些具体的Product_code。我现在做的映射如下:
    <!-- MainPo对象定义 -->
   <resultMap id="Main_Po" class="MainPo"> 
<result property="ItemNo" column="ITEM_NO"/>
<result property="MsgDate" column="MSG_DATE"/>
<result property="Desc" column="DESC"/>
<result property="dtls" column="ITEM_NO" select="select_dtls" />
</resultMap> <!-- DtlPo对象定义 -->
<resultMap id="Dtl_Po" class="DtlPo">
<result property="Type" column="PRODUCT_TYPE"/>
<result property="Price" column="PRODUCT_PRICE"/>
<result property="codes" column="PRODUCT_TYPE" select="select_codes" />
</resultMap> <!--第一步 供外部调用,取得主表与子表这种1对多的关系 -->
<select id="select_all"  resultMap="Main_Po">
    <![CDATA[
SELECT 
ITEM_NO,
MSG_DATE,
DESC
FROM 
T_Main 
WHERE
    TRUNC(UPDATE_TIME) = TRUNC(SYSDATE)     --取得当天插入的数据
 ]]>
</select>
<!-- 第二步 根据主表的ItemNo,取得子表里,有几种Product_Type -->
    <statement id="select_dtls" parameterClass="String" resultMap="Dtl_Po">
    <![CDATA[
     SELECT 
PRODUCT_TYPE,
PRODUCT_PRICE
     FROM 
     T_Dtl
     WHERE 
         ITEM_NO = #ITEM_NO#  --主表的ItemNo
        GROUP BY PRODUCT_TYPE,PRODUCT_PRICE
    ]]>
</statement>
<!-- 第三步 取得这个ItemNo下,每种产品有具体哪些产品编码 -->
<statement id="select_codes" parameterClass="String" resultClass="String">
     <![CDATA[
     SELECT 
     PRODUCT_CODE
     FROM 
     T_Dtl 
     WHERE 
     PRODUCT_TYPE = #PRODUCT_TYPE#
     ]]>
</statement>
第一步、第二步连起来是对的,
这种ItemNo和Type的一对多关系可以正确的取得。但是第三步出现了问题。PRODUCT_CODE,要通过ItemNo和Product_type共同确定。
但现在是 只是根据Product_type取得这个T_Dtl表中所有的Product_code。请问要怎样做,才能做到这样的约束呢?
我的想法是在第三步时,可以传入两个参数,
一个是在第二步时候用到的ItemNo,还有一个就是Product_Type。
请问我该怎么写才能做到呢?

解决方案 »

  1.   

    是不是在第二步的时候直接把Code搜索出来呢?请高人指点啊。
      

  2.   

    iBATIS一直没用过 晚上研究一下楼主的例子...
      

  3.   

    用ibatis写过几个项目了,但还没碰到你这么麻烦的,你的那些业务问题在dao下处理不行么?
      

  4.   

    <!-- MainPo对象定义 -->
    <resultMap id="Main_Po" class="MainPo">
    <result property="ItemNo" column="ITEM_NO"/>
    <result property="MsgDate" column="MSG_DATE"/>
    <result property="Desc" column="DESC"/>
    <result property="dtls" column="ITEM_NO" select="select_dtls" />
    </resultMap><!-- DtlPo对象定义 -->
    <resultMap id="Dtl_Po" class="DtlPo">
    <result property="ItemNo" cloumn="ITEM_NO"/>
    <result property="Type" column="PRODUCT_TYPE"/>
    <result property="Price" column="PRODUCT_PRICE"/>
    <result property="codes" column="Dtl_Po" select="select_codes" />
    </resultMap><!--第一步 供外部调用,取得主表与子表这种1对多的关系 -->
    <select id="select_all"  resultMap="Main_Po">
        <![CDATA[
    SELECT
    ITEM_NO,
    MSG_DATE,
    DESC
    FROM
    T_Main
    WHERE
        TRUNC(UPDATE_TIME) = TRUNC(SYSDATE)    --取得当天插入的数据
    ]]>
    </select>
    <!-- 第二步 根据主表的ItemNo,取得子表里,有几种Product_Type -->
        <statement id="select_dtls" parameterClass="String" resultMap="Dtl_Po">
        <![CDATA[
        SELECT
    PRODUCT_TYPE,
    PRODUCT_PRICE,
    ITEM_NO
        FROM
        T_Dtl
        WHERE
            ITEM_NO = #ITEM_NO#  --主表的ItemNo
            GROUP BY PRODUCT_TYPE,PRODUCT_PRICE
        ]]>
    </statement>
    <!-- 第三步 取得这个ItemNo下,每种产品有具体哪些产品编码 -->
    <statement id="select_codes" parameterClass="DtlPo" resultClass="String">
        <![CDATA[
        SELECT
        PRODUCT_CODE
        FROM
        T_Dtl
        WHERE
        ITEM_NO = #ITEM_NO# and 
        PRODUCT_TYPE = #PRODUCT_TYPE#
        ]]>
    </statement> 
    LZ.我也是ibatis新手。你试试看吧
      

  5.   

    我已经解决这个问题了。
    参考:
    http://www.router.net.cn/Article/23912.html