当前使用版本(必填,否则不予处理)
该问题是如何引起的?(确定最新版也有问题再提!!!)
重现步骤(如果有就写完整)
报错信息
Comment From: timnick-snow
一直在寻找,不写xml,不写sql的方式实现简单的多表连接查询 比如,像这样的
List<ReturnModel> list = SomeClassOrInstance.select(ReturnModel.class)
.from(TableA.class, TableB.class)
.leftJoin((t1, t2) -> eq(t1.getUserId, t2.getUserId))
.where(queryWrapper)
.list();
Comment From: totoro52
emmm,mybatis最核心的就是用xml去做一些灵活的SQL,如果又变成代码的方式,可以考虑一下JPA
Comment From: Ouyang-Yu
mpj是可以的,就是每个连的表都要创建mapper 另外阿里规范不推荐3表以上join,高性能mysql也推荐用多条sql代替 可以考虑用mp多次查询
Comment From: totoro52
mpj是可以的,就是每个连的表都要创建mapper 另外阿里规范不推荐3表以上join,高性能mysql也推荐用多条sql代替 可以考虑用mp多次查询
阿里规范不推荐3表以上join,但并没有提供合理的解决方案, 但实际上很多业务还是需要多个表join的,除非你的表不采用范式来设计才能真正避免JOIN,另外大厂都有自己的数据检索引擎,根本不需要走普通的join
Comment From: xuejmnet
一直在寻找,不写xml,不写sql的方式实现简单的多表连接查询 比如,像这样的
java List<ReturnModel> list = SomeClassOrInstance.select(ReturnModel.class) .from(TableA.class, TableB.class) .leftJoin((t1, t2) -> eq(t1.getUserId, t2.getUserId)) .where(queryWrapper) .list();
https://github.com/xuejmnet/easy-query 兄弟有兴趣可以看看我这个项目,目前已经开发差不多了,写了1个月了多表,嵌套表都已经支持了
Topic topic = easyQuery
.queryable(Topic.class)
//join 后面是双参数委托,参数顺序表示join表顺序,可以通过then函数切换
.leftJoin(BlogEntity.class, (t, t1) -> t.eq(t1, Topic::getId, BlogEntity::getId))
.where(o -> o.eq(Topic::getId, "3"))
.firstOrNull();
==> Preparing: SELECT t.`id`,t.`stars`,t.`title`,t.`create_time` FROM t_topic t LEFT JOIN t_blog t1 ON t.`id` = t1.`id` WHERE t.`id` = ? LIMIT 1
==> Parameters: 3(String)
<== Total: 1
List<BlogEntity> blogEntities = easyQuery
.queryable(Topic.class)
//join 后面是双参数委托,参数顺序表示join表顺序,可以通过then函数切换
.innerJoin(BlogEntity.class, (t, t1) -> t.eq(t1, Topic::getId, BlogEntity::getId))
.where((t, t1) -> t1.isNotNull(BlogEntity::getTitle).then(t).eq(Topic::getId, "3"))
//join查询select必须要带对应的返回结果,可以是自定义dto也可以是实体对象,如果不带对象则返回t表主表数据
.select(BlogEntity.class, (t, t1) -> t1.columnAll())
.toList();
==> Preparing: SELECT t1.`id`,t1.`create_time`,t1.`update_time`,t1.`create_by`,t1.`update_by`,t1.`deleted`,t1.`title`,t1.`content`,t1.`url`,t1.`star`,t1.`publish_time`,t1.`score`,t1.`status`,t1.`order`,t1.`is_top`,t1.`top` FROM t_topic t INNER JOIN t_blog t1 ON t.`id` = t1.`id` WHERE t1.`title` IS NOT NULL AND t.`id` = ?
==> Parameters: 3(String)
<== Total: 1
Queryable<Topic> sql = easyQuery
.queryable(Topic.class)
.where(o -> o.eq(Topic::getId, "3"));
//SELECT t.`id`,t.`stars`,t.`title`,t.`create_time` FROM t_topic t WHERE t.`id` = ?
List<BlogEntity> topics = easyQuery
.queryable(BlogEntity.class)
.leftJoin(sql,(a,b)->a.eq(b,BlogEntity::getId,Topic::getId))
.where(o -> o.isNotNull(BlogEntity::getId).eq(BlogEntity::getId,"3"))
.toList();
==> Preparing: SELECT t.`id`,t.`create_time`,t.`update_time`,t.`create_by`,t.`update_by`,t.`deleted`,t.`title`,t.`content`,t.`url`,t.`star`,t.`publish_time`,t.`score`,t.`status`,t.`order`,t.`is_top`,t.`top` FROM t_blog t LEFT JOIN (SELECT t.`id`,t.`stars`,t.`title`,t.`create_time` FROM t_topic t WHERE t.`id` = ?) t1 ON t.`id` = t1.`id` WHERE t.`id` IS NOT NULL AND t.`id` = ?
==> Parameters: 3(String),3(String)
<== Total: 1
Comment From: javaofferss
default List<User> queryAllAndOrder(){
return select()
.colAll()
.leftJoin(UserOrder::new)
.colAll()
.on()
.oeq(User::getId,UserOrder::getUserId)
.where()
.exs();
}
https://github.com/javaoffers/mybatis-jql 这种方式也可以. 不过最多支持三张表.
Comment From: qmdx
MP 下一个大版本 4.0 会支持,目前建议使用 https://github.com/yulichang/mybatis-plus-join