Model类中的findById方法

在访问数据库的时候,我想找一个根据id集合查询列表的方法,但是没有找到。虽然看到有这样一个重载方法,但是返回值是单个的M:

public M findById(Object... idValues)

不太清楚作者是出于什么考虑设计的这个方法,既然参数是一个id列表,为什么返回值不是List<M>呢?

如果真有这样做的必然原因,能不能再提供一些方便in查询的方法呢?

比如这样的签名:

//默认用主键in
public List<M> findByIds(Iterator idValues) 

//也可以指定列名in
public List<M> findByIds(String idFieldName,Object... idValues)

public List<M> findByIds(String idFieldName,Iterator  idValues)

(由于自己写过.net的orm,感觉这样的in查询用的频率还是挺多的)

评论区

山东小木

2016-09-28 16:28

public M findById(Object... idValues)方法不是传id集合 这个方法是用来传复合主键的

山东小木

2016-09-28 16:31

根据id集合查询列表 如果id几个数量小的话 可以自己拼接in语句

JFinal

2016-09-28 16:39

@小木学堂 所说,jfinal 提供的 findById(Object... idValues) 是查询拥有复合主键model的,你的建议很好,回忆一下平时开发 where id in(...) 这种用法确实挺多,已做备忘,jfinal 2.3 会考虑添加此功能

山东小木

2016-09-28 16:51

@JFinal 我课程讲到多id查询的时候 是小数据量的情况下 构造的in语句

loogn

2016-09-28 17:04

@JFinal @小木学堂 原来是复合主键,一时没想到,惭愧! 感谢及时回复~

loogn

2016-09-28 17:08

@小木学堂 还有很多时候id是另一个列表的一列数据,用Linq4j很容易得到一个集合

山东小木

2016-09-28 17:10

@loogn select * from tablea where cat_id in(select id from tableb where ***)这种? jfinal可以随便写sql只要你数据库里运行没问题

山东小木

2016-09-28 17:12

@loogn 再复杂一点的可以用sqls工具类 jfinal也提供了 可以从模板中加载渲染后的sql

JFinal

2016-09-28 17:12

@loogn @小木学堂 jfinal 2.3 会考虑添加 findInIds(Object... ids)、findInIds(String columns, Object... ids) 这两个方法

其中后面这个方法可以指定要加载的字段,通常获取 model list 的时候只是为了加载 id、title 等少数字段,是不需要加载 content 字段的,用法可以是这样:article.findInIds("id, title", 1,2,3,4....);

山东小木

2016-09-28 17:13

@JFinal 那就妥妥的了

loogn

2016-09-28 17:16

@JFinal 感觉可以再灵活一点,如果一个用户表(id,name,age),我想查询age in(20,30)的呢?

loogn

2016-09-28 17:23

@JFinal 我那个.net的ORM里有这样一个方法:

///
/// 根据字段集合查询数据
///
/// 字段值集合
/// 字段名称,默认是ID
/// 查询的字段,默认是*
///
public List SelectByIds(IEnumerable idValues, string idField = "ID", string selectFields = "*")

JFinal

2016-09-28 17:59

@loogn jfinal 只会顾及最常用的用法,类似于 age in (20, 30) 的直接用 find(String sql, Object... paras) 即可,取舍对于框架来说是必须的,否则复杂度、学习成本会急剧上升

loogn

2016-09-28 18:17

@JFinal 恩,理解

zb0567

2016-10-07 02:11

lyq027

2019-12-15 14:30

@JFinal findInIds(Object... ids)、findInIds(String columns, Object... ids)为何这两个后续没加了呢,也蛮常用的

0弈

2020-08-15 19:47

findById() 传入的是一个Integer的值 为什么报500 findByID好像就没有执行一样