<!--统计指定节点子节点具有指定节点名称的数目--> <select id="countChildrenWithNameInNode" parameterType="java.util.HashMap" resultType="java.lang.Integer" databaseId="oracle"> SELECT COUNT(*) CNT FROM "ORG_NODE" <where> <if test="pId!=null and pId!=''"> PARENT_ID=#{pId} </if> <if test="nodeName!=null and nodeName!=''"> AND NODE_NAME=#{nodeName} </if> </where> </select>
输出调试信息:
Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@a9e1e62] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@afebc12] will not be managed by Spring ==> Preparing: SELECT COUNT(*) value FROM "ORG_NODE" WHERE PARENT_ID=? AND NODE_NAME=? ==> Parameters: f86b732c75e447a7a34b472a4dc8a9de(String), R(52)(String) <== Columns: VALUE <== Row: 0 <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@a9e1e62]
很简单的一个SQL语句,为什么总是返回0。用调试信息输出的语句测试,返回结果不是0。
数据库是oracle。
这里有个类似的提问:http://mybatis-user.963551.n3.nabble.com/Problem-with-count-in-mybatis-td3715763.html
这里sql打印出来的Total:1 ,不是指count(*)结果是1,而是表示结果集是1,无论count(*)是否查到数据了,结果集都会返回1的。你count出来为0,说明sql查出来就是0条符合条件的数据。请检查下参数顺序以及NODE_NAME是否确实是 R(52)
Count(*)和value之间不需要逗号么?
另外,你是啥数据库呢?
不是value的问题,改过这个也没用
value是给字段重新取的名字,不是另外一个字段
@万里沙来手一挥: 你可以去掉查询条件试试,多半是查询条件导致的,
还可以监控最终执行的sql,手动执行试试,
最后,你还需要看看你是用代码执行这个sql的,有些方法返回的是受影响的行数。
你看下两个问号传值了没,语句应该没错 最可能就是?号传值有问题
java代码是用什么接的这个值?方便贴下吗
用int
int countFactorWithName = orgNodeService.countChildrenWithNameInNode(devId, col);
@万里沙来手一挥: 调试了吗 ? 是走到这就是0了 还是传到前台后才变为0的?
@初学者_XH: 走到这里 就是0了,在调试信息中能看到生成的SQL语句和查询结果
@万里沙来手一挥: 那我就不会了...
你的表名字为什么要用双引号引起来,
CNT 是COUNT(*)的别名,
oracle中如果区分大小写需要括起来,全大写的可以不用括
@万里沙来手一挥:
resultType="java.lang.Integer" 返回类型会不会不是这个???而是一个对象
你把sql语句放到plsql中执行一下,看有没有数据记录!
解决之前没看懂,解决之后看懂了,这还是自己搜索和思考的方式有问题吧