当前使用版本(必填,否则不予处理)

该问题是如何引起的?(确定最新版也有问题再提!!!)

重现步骤(如果有就写完整)

报错信息

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