NutzCN Logo
问答 19c数据库查询结果为null
发布于 9天前 作者 qiuhao-sam 252 次浏览 复制 上一个帖子 下一个帖子
标签:

框架使用nutz 1.r.66
数据库版本 19c
数据库驱动 ojdbc8
数据源 com.alibaba.druid 1.1.21

                <dependency>
			<groupId>org.nutz</groupId>
			<artifactId>nutz</artifactId>
			<version>1.r.66</version>
		</dependency>
 		<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc8</artifactId>
			<version>19.3.0.0</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.21</version>
		</dependency>

使用fetch方法查询,结果值为null。

User userByName = dao.fetch(User.class, Cnd.where("login_name", "=", "admin"));
System.err.println(userByName);

使用oracle 19c数据库查询结果:
User{id='null', loginName='null', password='null', name='null', organ='null', pwdErrorNumber=0, status='null', lastLoginTime=null}
使用oracle 11g数据库查询结果:
User{id='c8a4b083df484807af6b9a6162c14e61', loginName='admin', password='d033e22ae348aeb5660fc2140aec35850c4da997', name='null', organ='1700000000', pwdErrorNumber=0, status='1', lastLoginTime=2020-08-25 19:41:25.0}

12 回复

另外请注意: 19c的jdk8驱动, 18c驱动, 以及12c的jdk8驱动, 三个都叫ojdbc8.jar, 但它们并不是同一个. jar包大小也不一样. 19c的ojdbc8.jar比18c略大, 比12c大了接近一倍. 因为高版本驱动会包含更多的功能和特性. 所以下载时要与数据库版本对应, 不能只根据jar文件名称判断. 请注意区分

为什么查询19c版本的数据库字段为null值,求解?

写个自定义sql,用record回调,看看拿回来的是什么数据

@wendal
使用自定义sql record拿回来的是正确的数据。

                Dao dao;
                Ioc ioc;
		try {
			ioc = new NutIoc(new ComboIocLoader("*js", "config/"));
			dao = ioc.get(Dao.class);
			/** fetch/query方法  */
			User userByName = dao.fetch(User.class, Cnd.where("login_name", "=", "admin"));
			System.err.println(userByName);
			
			/** 自定义sql record回调 */
			Sql sql = Sqls.create("SELECT t.* FROM GPM_USER t WHERE login_name= 'admin'");
			sql.setCallback(Sqls.callback.record());
			sql.setEntity(dao.getEntity(User.class));
			dao.execute(sql);
			Record re = (Record) sql.getResult();
			System.err.println(re);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

日志:

For example:> "SELECT * FROM (SELECT T.*, ROWNUM RN FROM ( SELECT * FROM GPM_USER  WHERE login_name='admin') T WHERE ROWNUM <= 1) WHERE RN > 0 "
User{id='null', loginName='null', password='null', name='null', organ='null', pwdErrorNumber=0, status='null', lastLoginTime=null}
20-09-16 08:40:36.807 DEBUG [main] SELECT t.* FROM GPM_USER t WHERE login_name= 'admin'
{
   "id": "c8a4b083df484807af6b9a6162c14e61",
   "login_name": "admin",
   "password": "d033e22ae348aeb5660fc2140aec35850c4da997",
   "name": null,
   "organ": "1700000000",
   "status": "1",
   "pwd_error_number": 0,
   "last_login_time": "2020-08-25 19:41:25"
}

为何fetch方法和query方法查询到的是异常数据

分页语句可能不兼容了

你贴的自定义sql没有分页,差别就在这里

@wendal
在自定义sql中增加分页、自定义使用entity回调

        Dao dao;
        Ioc ioc;
		try {
			ioc = new NutIoc(new ComboIocLoader("*js", "config/"));
			dao = ioc.get(Dao.class);
			/** fetch/query方法  */
			User userByName = dao.fetch(User.class, Cnd.where("login_name", "=", "admin"));
			System.err.println(userByName);
			
			/** 自定义sql entity回调 */
			Sql sqlEntity = Sqls.create("SELECT t.* FROM GPM_USER t");
			sqlEntity.setCallback(Sqls.callback.entities());
			sqlEntity.setEntity(dao.getEntity(User.class));
			dao.execute(sqlEntity);
			List<NutMap> reEntity = (List<NutMap>) sqlEntity.getResult();
			System.err.println(reEntity);
			
			/** 自定义sql record回调 加分页*/
			Sql sqlRecord = Sqls.create("SELECT t.* FROM GPM_USER t");
			sqlRecord.setCallback(Sqls.callback.records());
			Pager pager = dao.createPager(1, 1);
			sqlRecord.setPager(pager);
			sqlRecord.setEntity(dao.getEntity(User.class));
			dao.execute(sqlRecord);
			List<NutMap> reRecord = (List<NutMap>) sqlRecord.getResult();
			System.err.println(reRecord);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

输出结果:

 For example:> "SELECT * FROM (SELECT T.*, ROWNUM RN FROM ( SELECT * FROM GPM_USER  WHERE login_name='admin') T WHERE ROWNUM <= 1) WHERE RN > 0 "
User{id='null', loginName='null', password='null', name='null', organ='null', pwdErrorNumber=0, status='null', lastLoginTime=null}
20-09-17 10:48:28.916 DEBUG [main] SELECT t.* FROM GPM_USER t
[User{id='null', loginName='null', password='null', name='null', organ='null', pwdErrorNumber=0, status='null', lastLoginTime=null}, User{id='null', loginName='null', password='null', name='null', organ='null', pwdErrorNumber=0, status='null', lastLoginTime=null}, User{id='null', loginName='null', password='null', name='null', organ='null', pwdErrorNumber=0, status='null', lastLoginTime=null}]
20-09-17 10:48:28.920 DEBUG [main] SELECT * FROM (SELECT T.*, ROWNUM RN FROM (SELECT t.* FROM GPM_USER t) T WHERE ROWNUM <= 1) WHERE RN > 0
[{
   "id": "c8a4b083df484807af6b9a6162c14e61",
   "login_name": "admin",
   "password": "d033e22ae348aeb5660fc2140aec35850c4da997",
   "name": null,
   "organ": "1700000000",
   "status": "1",
   "pwd_error_number": 0,
   "last_login_time": "2020-08-25 19:41:25",
   "rn": 1
}]

自定义sql中的record回调增加分页查询,结果仍然是正确的。

自定义sql使用entities回调,也有问题。

感谢大佬,问题解决了。
刚开始的时候我以为只需要引入ojdbc的包就行了,运行的时候也没有报错,所以不知道问题原因。
debug发现是setEntity时报:不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK

项目引入orai18n.jar这个jar包,问题就解决了。

	public void injectValue(Object obj, ResultSet rs, String prefix) {
		try {
                        // 此处向obj中注入值时,因为字符集的原因报错
			this.setValue(obj, adaptor.get(rs, prefix == null ? columnName : prefix + columnName));
		}
		catch (SQLException e) {
		    if (log.isTraceEnabled()) {
		        log.tracef("columnName="+columnName, e);
		    }
		}
	}

感谢!

原来如此,学到了

添加回复
请先登陆
回到顶部