Jfinal model findId多主键查询的问题


我msql建了一张多主键的表

blob.png

主键循序是 1.memder_id 2.point_type 3.index_time

Points pointsData = dao.findById(new Object[]{member.getId(), pointType.getCode(), indexDate});

但是日志中sql打印出来顺序确是

select `member_id`,`point_type`,`index_time` from `points` where `index_time` = 1 and `member_id` 
= 1 and `point_type` = '1970-01-01 00:00:00'

这样就sql错了,主键顺序不对,findById多主键的话主键的顺序jfinal中是怎么排序的?

评论区

JFinal

2017-08-13 11:54

在 _MappingKit.mapping(arp);这行一行代码之后添加一行:
arp.setPrimaryKey("points", "member_id, point_type, index_time");

这样就强制指定了多主键的次序,如果不强制指定,那么默认按照反射的结果来。 反射的结果通常是正确的,如果不正确很可能是建表的 sql 里面的次序有变动

yjjdick1990

2017-08-13 12:35

@JFinal 谢谢波总,下面加那行代码这样可以,但是我按你的说情况去检查过表,也重建了表确保我表的字段顺序是对的,还是一样不行,好像这个主键的反射结果顺序真的有问题,我不知道波总你最后一句建表的 sql 里面的次序有变动是指的哪些变动,我把sql贴给你,波总有兴趣可以试试?
CREATE TABLE `points` (
`member_id` varchar(128) NOT NULL,
`point_type` int(11) NOT NULL,
`index_time` datetime NOT NULL,
`point_value` double(20,0) NOT NULL,
`update_time` datetime NOT NULL,
PRIMARY KEY (`member_id`,`point_type`,`index_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
我建表工具是navicat premiunm 11.2.7 64位的

yjjdick1990

2017-08-13 13:34

@JFinal 波总还有个问题Db.batch中我想实现这样是个接口batch(List sqls,List sqlParas) ,因为我现在需求是我有很多条sql,sql执行语句是不同的,有insert,有update,然后每个sql对应的sqlpara也不一样,这样我该怎么实现比较好?好像现在jfinalbatch没有提供这样的接口

JFinal

2017-08-13 13:58

@yjjdick1990 通常来说,create table 这个建表的 sql 里面的字段的次序与反射出来的字段次序是有关系的,但或许不同的数据库版本以及 jdbc 驱动版本行为上有差别,建议对于多主键,添加一行强制指定的配置

无论什么原因引起的并不重要,重要的是要有应对机制。反射次序我们无法控制,手动指定才是我个可以干预的手段

JFinal

2017-08-13 14:05

batch 方法本质上是为某一条 sql 准备 n 多条数据,然后一次性发给数据库,注意观察一下 batch 方法中的 PreparedStatement 这个对象的操作过程:
1:获取 pst = conn.prepareStatement(sql); 这里意味着只有一条 sql
2:pst.setXxx(...) 注入字段数据
3:pst.addBatch() 将数据添加为 batch
4:pst.executeBatch(); 批量提交到数据库

简单说,batch 批量操作核心在于一条 sql ,多条数据,而这多条数据是重用了这一条 sql

另一种 batch 模式,注意看一下 DbPro 中带有 List sqlList参数的那个 batch 方法,是多条 sql, st.addBatch(sql); 但是这个不支持多条数据

如果你希望是多条 sql + 数据 的组合 batch 操作,估计无法实现,否则我当时应该会添加这个方法

希望你能发现 jdbc 有这个支持,搞定后记得反馈给我

yjjdick1990

2017-08-13 14:17

@JFinal 我尽量提高自己给jfinal做贡献,但是感觉想达到波总的高度估计这辈子也赶不上了,只能站在巨人的肩膀上写代码

JFinal

2017-08-13 14:23

@yjjdick1990 千万别这么说,多花时间专注于你喜欢与擅长的事情,就能超越前人,从来都是长江后浪推前浪

热门反馈

扫码入社