JFinal如何实现延迟加载

请问社区的各位大神,JFinal是如何实现像Mybatis一样的延迟加载,也就是当我用到级联的数据时,才把数据查出来

评论区

JFinal

2018-12-25 17:22

级联的数据放在 Model 中的一个 getXxx 方法中,然后在这个方法内部再用一次 find(...) 进行查询,这个天然就是延迟加载

action_dear60

2018-12-25 17:55

@JFinal 谢谢波总回复,但还是有些疑问,我是用波总提供的方法构建级联,但是在前端(Beetl模板)渲染数据的时候,单单用merchant对象的时候,却把user对象的值也查出来了,但是代码里测试时又是延迟加载,是Beetl那边的问题吗?
(贴上部分代码)
model里的->
public class Merchant extends BaseModel{
......
private Integer userId
......
public User getUser(){
return UserService.me.findById(getUserId());
}
}
测试的->
public void testVersion(){
Merchant merchant = MerchantService.me.findById(1);
System.err.println(merchant)
//System.err.println(merchant.getUser().getUser_name());
success(merchant);
}

JFinal

2018-12-25 17:57

单步调试一下确定问题,估计是模板中的 field 取值表达式触发了对 getUser 的调用,逐步触发的一个过程

action_dear60

2018-12-25 18:07

@JFinal 好的,谢谢波总,还有个问题就是关于乐观锁的,我看了MysqlDialect类中forModelUpdate()方法构造sql语句非主键字段只能在set中,而不会出现在where中,这样就无法构造乐观锁sql语句
update `t_test` set `name` = ? and `version` = version + 1 where `id` = ? and `version` = ?,
请问有什么好的建议吗?关于乐观锁的

MysqlDialect中的forModelUpdate()方法的代码->

public void forModelUpdate(Table table, Map attrs, Set modifyFlag, StringBuilder sql, List paras) {
sql.append("update `").append(table.getName()).append("` set ");
String[] pKeys = table.getPrimaryKey();
for (Entry e : attrs.entrySet()) {
String colName = e.getKey();
if (modifyFlag.contains(colName) && !isPrimaryKey(colName, pKeys) && table.hasColumnLabel(colName)) {
if (paras.size() > 0) {
sql.append(", ");
}
sql.append('`').append(colName).append("` = ? ");
paras.add(e.getValue());
}
}
sql.append(" where ");
for (int i=0; i if (i > 0) {
sql.append(" and ");
}
sql.append('`').append(pKeys[i]).append("` = ?");
paras.add(attrs.get(pKeys[i]));
}
}

JFinal

2018-12-25 18:12

@action_dear60 jfinal 的数据库操作只对 JDBC 做了极薄封装,没有乐观锁方面的支持,建议在现有的体系下,看看哪里可以扩展一下

action_dear60

2018-12-25 18:13

@JFinal 好的,再次谢谢波总倾情答复

热门反馈

扫码入社