我正在使用oracle数据库和spring ibatis。
我有一个查询,它将返回两个结果,我需要获取一个列上具有最小值的记录。
在Oracle中,我使用以下查询执行此操作:
SELECT *
FROM ANUMBER$ROOT ROOT
WHERE ROOT.ROOT_NUMBER=1546305
AND ROOT.MOL_WEIGHT = (SELECT MIN(MOL_WEIGHT)
FROM ANUMBER$ROOT
WHERE ROOT_NUMBER=1546305);
我已将此查询转换为如下所示的spring ibatis
SELECT *
FROM ANUMBER$ROOT ROOT
WHEREe ROOT.ROOT_NUMBER= #value#
AND ROOT.MOL_WEIGHT = (SELECT MIN(MOL_WEIGHT)
FROM ANUMBER$ROOT
WHERE ROOT_NUMBER= #value#);
但这会让我失误:
** log4j:WARN找不到logger(org.springframework.context.support.ClassPathXmlApplicationContext)的appender。 log4j:WARN请正确初始化log4j系统。例外 线程"主要" org.springframework.jdbc.UncategorizedSQLException: SqlMapClient操作;未分类的SQL []的SQLException; SQL 州[null];错误代码[0];
---错误发生在abbott / gprd / compoundInfo / dao / ibatis / LibraCompoundInformationLookup.xml中。---准备执行映射语句时发生错误 ---检查selectCompoundInfoByRootNumber ---检查SQL语句 ---原因:java.util.NoSuchElementException;嵌套异常是com.ibatis.common.jdbc.exception.NestedSQLException:
---错误发生在abbott / gprd / compoundInfo / dao / ibatis / LibraCompoundInformationLookup.xml中。---准备执行映射语句时发生错误 ---检查selectCompoundInfoByRootNumber ---检查SQL语句 ---原因:java.util.NoSuchElementException引起:com.ibatis.common.jdbc.exception.NestedSQLException:
---错误发生在abbott / gprd / compoundInfo / dao / ibatis / LibraCompoundInformationLookup.xml中。---准备执行映射语句时发生错误 ---检查selectCompoundInfoByRootNumber ---检查SQL语句 ---原因:com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:188)中的java.util.NoSuchElementException 在 com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104) 在 com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:566) 在 com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:541) 在 com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:106) 在 org.springframework.orm.ibatis.SqlMapClientTemplate $ 1.doInSqlMapClient(SqlMapClientTemplate.java:243) 在 org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:193) 在 org.springframework.orm.ibatis.SqlMapClientTemplate.queryForObject(SqlMapClientTemplate.java:241) 在 abbott.gprd.compoundInfo.dao.ibatis.CompoundInformationDao.getCompoundInformationForRootNumber(CompoundInformationDao.java:66) 在 abbott.gprd.compoundInfo.dao.ibatis.CompoundInformationDao.main(CompoundInformationDao.java:183) 引起:java.util.NoSuchElementException at java.util.StringTokenizer.nextToken(StringTokenizer.java:332)at com.ibatis.sqlmap.engine.mapping.sql.simple.SimpleDynamicSql.processDynamicElements(SimpleDynamicSql.java:90) 在 com.ibatis.sqlmap.engine.mapping.sql.simple.SimpleDynamicSql.getSql(SimpleDynamicSql.java:45) 在 com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:168) ... 9更多错误:JDWP无法获得JNI 1.2环境, jvm-> GetEnv()返回代码= -2 JDWP退出错误 AGENT_ERROR_NO_JNI_ENV(183):[../../../ src / share / back / util.c:820] **
任何人都可以帮助我将此查询从oracle转换为spring ibatis吗?
答案 0 :(得分:0)
评论太长了:
您可以使用RANK
(或DENSE_RANK
)分析函数找到具有给定列的最小值的行(并且这不需要额外的相关查询):
SELECT *
FROM (
SELECT root.*,
RANK() OVER ( ORDER BY MOL_WEIGHT ) AS rnk
FROM ANUMBER$ROOT ROOT
WHERE ROOT_NUMBER=1546305
)
WHERE rnk = 1;