ibatis 多表关联查询的问题,请大家来看下,谢谢

池彩虹 2008-06-23 05:51:23
-------sqlMap-----------
<!-- account表中带有List类型的role即角色编号-->
<sqlMap>
<resultMap id="account" class="com.uucun.csjexam.entity.Account" >
<result property="id" column="ID" />
<result property="userName" column="USERNAME" />
<result property="loginIp" column="LOGINIP" />
<result property="loginDate" column="LOGINDATE" />
<result property="role" select="getRole" column="ROLE_ID" />
</resultMap>

<resultMap id="role" class="com.uucun.csjexam.entity.Role">

<result property="id" column="ID" />
<result property="role" column="ROLE"/>

</resultMap>

<!-- 获取帐户总量 -->
<select id="getAccountCount" resultClass="java.lang.Integer">
SELECT COUNT(*) C FROM TBL_CSJ_ACCOUNT
<dynamic prepend="WHERE">
<isNotEmpty prepend="AND" property="id"> ID = #id# </isNotEmpty>

</dynamic>
</select>



<!-- 获取角色真实名 -->
<select id="getRole" parameterClass="int" resultMap="role">
SELECT
ROLE
FROM TBL_CSJ_ROLE WHERE ID=#value#




</select>

<!-- 获取帐户信息 -->
<select id="listSplitAccount" parameterClass="java.util.Map" resultMap="account">
SELECT * FROM
( SELECT A.*, ROWNUM R FROM
( SELECT
ID,
USERNAME,
LOGINIP,
LOGINDATE,
ROLE_ID

FROM TBL_CSJ_ACCOUNT
<dynamic prepend="WHERE">
<isNotEmpty prepend="AND" property="id">ID=#id#</isNotEmpty>

</dynamic>
) A
<![CDATA[
WHERE ROWNUM <= #end# ) B
WHERE R > #start#
]]>
</select>
</sqlMap>


我在运行listSplitAccount时候,返回的日志如下:
2008-06-23 17:36:17,418 DEBUG [java.sql.Connection] http-9000-Processor25 com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:27) - <{conn-100000} Connection>
2008-06-23 17:36:17,496 DEBUG [java.sql.Connection] http-9000-Processor25 com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:27) - <{conn-100000} Preparing Statement: SELECT COUNT(*) C FROM TBL_CSJ_ACCOUNT >
2008-06-23 17:36:18,387 DEBUG [java.sql.PreparedStatement] http-9000-Processor25 com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:27) - <{pstm-100001} Executing Statement: SELECT COUNT(*) C FROM TBL_CSJ_ACCOUNT >
2008-06-23 17:36:18,387 DEBUG [java.sql.PreparedStatement] http-9000-Processor25 com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:27) - <{pstm-100001} Parameters: []>
2008-06-23 17:36:18,387 DEBUG [java.sql.PreparedStatement] http-9000-Processor25 com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:27) - <{pstm-100001} Types: []>
2008-06-23 17:36:18,449 DEBUG [java.sql.ResultSet] http-9000-Processor25 com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:27) - <{rset-100002} ResultSet>
2008-06-23 17:36:18,543 DEBUG [java.sql.ResultSet] http-9000-Processor25 com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:27) - <{rset-100002} Header: [C]>
2008-06-23 17:36:18,543 DEBUG [java.sql.ResultSet] http-9000-Processor25 com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:27) - <{rset-100002} Result: [1]>
2008-06-23 17:36:18,715 DEBUG [java.sql.Connection] http-9000-Processor25 com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:27) - <{conn-100003} Connection>
2008-06-23 17:36:18,715 DEBUG [java.sql.Connection] http-9000-Processor25 com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:27) - <{conn-100003} Preparing Statement: SELECT * FROM ( SELECT A.*, ROWNUM R FROM ( SELECT ID, USERNAME, LOGINIP, LOGINDATE, ROLE_ID FROM TBL_CSJ_ACCOUNT ) A WHERE ROWNUM <= ? ) B WHERE R > ? >
2008-06-23 17:36:18,715 DEBUG [java.sql.PreparedStatement] http-9000-Processor25 com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:27) - <{pstm-100004} Executing Statement: SELECT * FROM ( SELECT A.*, ROWNUM R FROM ( SELECT ID, USERNAME, LOGINIP, LOGINDATE, ROLE_ID FROM TBL_CSJ_ACCOUNT ) A WHERE ROWNUM <= ? ) B WHERE R > ? >
2008-06-23 17:36:18,731 DEBUG [java.sql.PreparedStatement] http-9000-Processor25 com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:27) - <{pstm-100004} Parameters: [1, 0]>
2008-06-23 17:36:18,746 DEBUG [java.sql.PreparedStatement] http-9000-Processor25 com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:27) - <{pstm-100004} Types: [java.lang.Integer, java.lang.Integer]>
2008-06-23 17:36:18,762 DEBUG [java.sql.ResultSet] http-9000-Processor25 com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:27) - <{rset-100005} ResultSet>
2008-06-23 17:36:18,793 DEBUG [java.sql.ResultSet] http-9000-Processor25 com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:27) - <{rset-100005} Header: [ID, USERNAME, LOGINIP, LOGINDATE, ROLE_ID]>
2008-06-23 17:36:18,793 DEBUG [java.sql.ResultSet] http-9000-Processor25 com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(JakartaCommonsLoggingImpl.java:27) - <{rset-100005} Result: [10001, tracyjoy, 127.0.0.1, 2008-06-23 00:00:00.0, 10002]>


根本没有运行关联表查询,请问这是什么回事谢谢。
<result property="role" select="getRole" column="ROLE_ID" />这句相当于没有任何作用。
...全文
2161 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
后天星期一 2010-05-25
  • 打赏
  • 举报
回复
飘过~~~~~~~~~~~~~~~~~~~~~~~~
ypf20062008 2009-05-13
  • 打赏
  • 举报
回复
看了讨论的过程 觉得挺好
池彩虹 2008-07-06
  • 打赏
  • 举报
回复
谢谢。
Landor2004 2008-07-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tracyjoy 的回复:]
Account类中不需要Role实体类吧,我存在个List类 用来获取Role类的集合。
[/Quote]

你的类是一对多的关系,一是Account,多是Role的集合list,那在你的ROLE表里应该存放ACCOUNT的id
当你检索ACCOUNT的时候,要根据ACCOUNT_ID来检索ROLE里的相应结果集,要弄清楚过程
所以这里的column是ACCOUNT_ID
Landor2004 2008-07-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 tracyjoy 的回复:]
引用 12 楼 Landor2004 的回复:
<result property="role"  select="getRole" column="ROLE_ID" />

问一下,这里的ROLE_ID是什么意思,这里的column存的是ACCOUNT的id,也就是ROLE表的外键
你的命名有问题,还是写错了


column存的是ROLE_ID 和ROLE表中的ID对应的。
[/Quote]

你的column应该存放ROLE表对应ACCOUNT外键,也就是ACCOUNT_ID,应该这样
<result property="role" select="getRole" column="ACCOUNT_ID" />

根据它来检索子集合嘛
池彩虹 2008-07-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 Landor2004 的回复:]
<result property="role" select="getRole" column="ROLE_ID" />

问一下,这里的ROLE_ID是什么意思,这里的column存的是ACCOUNT的id,也就是ROLE表的外键
你的命名有问题,还是写错了
[/Quote]

column存的是ROLE_ID 和ROLE表中的ID对应的。
fosjos 2008-07-02
  • 打赏
  • 举报
回复
试试
<select id="getRole" parameterClass="int" resultMap="role">
SELECT
ID, ROLE
FROM TBL_CSJ_ROLE WHERE ID=#value#
</select>
池彩虹 2008-06-30
  • 打赏
  • 举报
回复
N+1我还没试过效率多么低,主要我用的轻量级的开发,所以选择ibatis.

getAccountCount的Select不需要parameterClass,没有引用任何参数,getRole的Select我每个字段都对应啦,真是奇怪啦~。

Landor2004 2008-06-30
  • 打赏
  • 举报
回复
<result property="role" select="getRole" column="ROLE_ID" />

问一下,这里的ROLE_ID是什么意思,这里的column存的是ACCOUNT的id,也就是ROLE表的外键
你的命名有问题,还是写错了

fosjos 2008-06-29
  • 打赏
  • 举报
回复
试试
<select id="getRole" parameterClass="int" resultMap="role">
SELECT
ID, ROLE
FROM TBL_CSJ_ROLE WHERE ID=#value#
</select>

感觉像是resultMap映射异常
fosjos 2008-06-29
  • 打赏
  • 举报
回复
account中role是什么类型
手册上应该有例子的
如果用这种one-to-many模式,说实话,还不如去用hibernate方便
1+n的效率很差

ibatis方便在于可以随便加关联的字段,而且不用完全映射
fosjos 2008-06-29
  • 打赏
  • 举报
回复
<select id="getAccountCount" resultClass="java.lang.Integer">
SELECT COUNT(*) C FROM TBL_CSJ_ACCOUNT
<dynamic prepend="WHERE">
<isNotEmpty prepend="AND" property="id"> ID = #id# </isNotEmpty>

</dynamic>
</select>

缺少parameterClass
池彩虹 2008-06-29
  • 打赏
  • 举报
回复
真的没人来解答下这个原因吗。
池彩虹 2008-06-25
  • 打赏
  • 举报
回复
这贴有没解,就散分啦~
Landor2004 2008-06-24
  • 打赏
  • 举报
回复
数据库里有记录吧,看配置差不多没问题
把下面的select role 改成select* 试试

<!-- 获取角色真实名 -->
<select id="getRole" parameterClass="int" resultMap="role">
SELECT
ROLE
FROM TBL_CSJ_ROLE WHERE ID=#value#
</select>
池彩虹 2008-06-24
  • 打赏
  • 举报
回复
Account类中不需要Role实体类吧,我存在个List类 用来获取Role类的集合。
fengyifei11228 2008-06-24
  • 打赏
  • 举报
回复
com.uucun.csjexam.entity.Account类中有没有com.uucun.csjexam.entity.Role类的实例

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧