service执行sql和数据执行sql查询结果不一致

public void setAreaSort(java.lang.Integer areaSort) {

set("area_sort", areaSort);

}

public java.lang.Integer getAreaSort() {

return getInt("area_sort");

}


public void setAreaDeep(java.lang.Integer areaDeep) {

set("area_deep", areaDeep);

}

public java.lang.Integer getAreaDeep() {

return getInt("area_deep");

}

------------------------------

image.png


数据库本身存的area_deep为1,2,3 service查的list结果都为true,area_deep换成area_sort字段查询出来的结果和数据库一致

评论区

95txc

2018-12-22 10:30

service查出的list集合area_deep的值都为true

95txc

2018-12-22 10:34

注:实体最初生成的时候area_deep是boolean类型,后来我改了成这样的

95txc

2018-12-22 10:52

95txc

2018-12-22 10:53

JFinal

2018-12-22 12:19

终极解决方案:
1:手动从数据源获取一下 Connection,例如 dataSoruce.getConnection()

2:手动用 connection 行执一下这个 sql,也就是说用纯 JDBC 去执行一下

3:对比结果即可

JFinal

2018-12-22 12:21

多说一句,快捷获取 JDBC 的 Connection 的方法如下:
Db.getConfig().getDataSource().getConnection();

当然,你也可以自己通过 JDBC 原生的 API 得到 Connection,结论是一样的

95txc

2018-12-22 15:02

好的,谢谢提供的方案.

95txc

2018-12-22 15:10

Db这个类下面没有这个getConfig()这个方法呀,是我理解有问题么@JFinal

JFinal

2018-12-22 15:13

@95txc 前面手误,应该是 DbKit.getConfig()

95txc

2018-12-22 15:29

同样的sql原生JDBC查询结果和数据库查询结果一致,用area.find(sql)就有问题@JFinal

95txc

2018-12-22 15:37

@JFinal Connection conn=DbKit.getConfig().getDataSource().getConnection();
Statement statement = null;
ResultSet rs = null;
statement = conn.createStatement();
rs = statement.executeQuery(sql);
while(rs.next()){
String area_deep = rs.getString("area_deep");
System.out.println("area_deep:"+area_deep);
}

JFinal

2018-12-22 15:46

检查一下 area_deep 的长度是否为 1, JDBC 查出的结果,如果字段类型是 int(1),通过 getObject 得到的是 true 和 false

而你用纯 JDBC 使用的是 getString("area_deep")

这里面与 jfinal 的唯一区别在于 jfinal 用的 rs.getObject(...),而你用的是 rs.getString(...)

这两种用法在绝大多数情况下返回值是一样的,但是 int 型字段在长度为 1 的时候,JDBC 会将 int 自动转成 boolean

95txc

2018-12-22 16:27

@JFinal 弄好了tinyint 数据库这个类型的数据原来为1改成3就好了.

95txc

2018-12-22 16:27

长度

95txc

2018-12-22 16:29

@JFinal 数据库tinyint这个长度设为1的时候那个好像不识别为int

JFinal

2018-12-22 16:34

@95txc 前面笔误,tinyint(1) 说成了 int(1),其实改成 tinyint(2) 就可以了

如果极其注重节省存放空间,用 tinyint(2) 比 tinyint(3) 节省一个字节

热门反馈

扫码入社