添加子信息mybatis查询语句

本文展示了如何使用SQL语句查询指定部门下所有员工的名字,并通过连接子查询来获取部门层级和类型信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查询部门下的人的名字,SSI下,其SQL语句为:

 SELECT   DISTINCT TD.*, wm_concat (TE.EMPLOYEE_NAME) AS DEP_EMPLOYEE
    FROM   (           SELECT   TD.ID,
                                TD.PARENT_ID,
                                TD.DEPARTMENT_NAME,
                                TD.DEPARTMENT_ORDER || '级部门' AS DEPARTMENT_ORDER_NAME,
                                TD.DEPARTMENT_ORDER,
                                TD.CREATED_BY,
                                TD.DEPARTMENT_NUM,
                                TD.DEPARTMENT_LEVEL,
                                LPAD (' ', LEVEL * 4, ' ') || TD.DEPARTMENT_NAME
                                   AS DEPARTMENT_NAME_LEVEL,
                                TD.DEPARTMENT_TYPE,
                                TD.REMARK,
                                NVL (
                                   (  SELECT   COUNT (TE.DEPARTMENT_ID)
                                        FROM   TBL_EMPLOYEE TE,
                                               STBL_PRI_USER_ROLE SPUR,
                                               STBL_PRI_ROLE SPR
                                       WHERE       TE.IS_DELETED = 'N'
                                               AND SPUR.IS_DELETED = 'N'
                                               AND SPR.IS_DELETED = 'N'
                                               AND TE.MGR_ID = SPUR.MGR_ID
                                               AND SPUR.ROLE_ID = SPR.ROLE_ID
                                               AND TD.ID = TE.DEPARTMENT_ID
                                    GROUP BY   TD.DEPARTMENT_NAME),
                                   '0'
                                )
                                   AS COUNT,
                                (SELECT   NAME
                                   FROM   SYS_DATA
                                  WHERE   TYPE_CODE = 'DEPARTMENT_TYPE'
                                          AND CODE = TD.DEPARTMENT_TYPE)
                                   AS DEPARTMENT_TYPE_NAME,
                                TO_CHAR (TD.CREATED_DT, 'YYYY-MM-DD HH:MM') AS CREATED_DT
                                
                         FROM   TBL_DEPARTMENT TD
                         
                        WHERE   TD.IS_DELETED = 'N'
                   CONNECT BY   TD.PARENT_ID = PRIOR TD.ID
                   START WITH   TD.PARENT_ID = '0'
            ORDER SIBLINGS BY   DEPARTMENT_LEVEL) TD,
           TBL_EMPLOYEE TE
           
   WHERE   TE.IS_DELETED = 'N' AND TD.ID = TE.DEPARTMENT_ID
GROUP BY   TD.ID,
           TD.PARENT_ID,
           TD.DEPARTMENT_NAME,
           TD.DEPARTMENT_ORDER_NAME,
           TD.DEPARTMENT_ORDER,
           TD.CREATED_BY,
           TD.DEPARTMENT_NUM,
           TD.DEPARTMENT_LEVEL,
           DEPARTMENT_NAME_LEVEL,
           TD.DEPARTMENT_TYPE,
           TD.REMARK,
           TD.COUNT,
           TD.DEPARTMENT_TYPE_NAME,
           TD.CREATED_DT

<think>我们正在讨论MyBatis-Plus中的apply方法。根据引用[1],apply方法用于拼接SQL语句,特别是动态地向数据库函数传递参数。例如:apply("date_format(dateColumn,'%Y-%m-%d')={0}","2020-10-08")。用户想要一个使用apply方法的示例查询语句。我们需要构建一个使用apply方法的查询条件。在MyBatis-Plus中,我们通常使用QueryWrapper来构建条件。apply方法可以直接在SQL中插入一段语句,并支持使用占位符{0}、{1}等来动态传递参数,这样可以防止SQL注入。示例场景:假设我们有一个订单表,我们想查询在2020年10月8日创建的订单,并且订单金额大于100元。其中,日期字段在数据库中是datetime类型,我们只需要比较日期部分(忽略时间部分),所以使用date_format函数。步骤:1.创建QueryWrapper对象。2.使用apply方法添加日期格式化条件。3.添加其他条件(如金额大于100)。代码示例:```javaQueryWrapper<Order>queryWrapper=newQueryWrapper<>();queryWrapper.apply("date_format(create_time,'%Y-%m-%d')={0}","2020-10-08").gt("amount",100);```这样生成的SQL片段类似于:```sqlWHEREdate_format(create_time,'%Y-%m-%d')='2020-10-08'ANDamount>100```注意:apply方法中的占位符{0}会被后面的参数替换,MyBatis-Plus会自动处理参数注入,避免SQL注入风险。另外,引用[2]提到了select方法,我们可以配合使用select方法来指定查询的列。例如,我们只查询id和amount列:```javaqueryWrapper.select("id","amount");```完整示例:```javaQueryWrapper<Order>queryWrapper=newQueryWrapper<>();queryWrapper.select("id","amount").apply("date_format(create_time,'%Y-%m-%d')={0}","2020-10-08").gt("amount",100);```引用[3]和[4]也提到了Wrapper的使用,特别是在Mapper接口中如何接收Wrapper参数。我们可以定义一个Mapper方法,接收Wrapper参数,然后在Service中调用。在Mapper接口中:```javapublicinterfaceOrderMapperextendsBaseMapper<Order>{//可以自定义方法,但BaseMapper已经提供了很多方法,通常可以直接使用//如果需要自定义SQL,也可以结合@Select注解,但引用[4]提到可以不用@Select注解,而是利用MyBatis-Plus的条件构造器//这里我们不需要额外定义方法,因为BaseMapper的selectList方法就可以接收Wrapper}```在Service中:```javaList<Order>list=orderMapper.selectList(queryWrapper);```因此,使用apply方法的关键在于构建QueryWrapper时调用apply方法,并传入合适的SQL片段和参数。注意事项:-apply方法中传入的SQL片段应该是数据库可执行的,因此要注意数据库的兼容性(比如MySQL和Oracle的日期函数不同)。-占位符{0}对应第一个参数,{1}对应第二个参数,以此类推。另一个示例:使用apply进行子查询。例如:查询订单金额大于平均金额的订单。```javaQueryWrapper<Order>queryWrapper=newQueryWrapper<>();queryWrapper.apply("amount>(SELECTAVG(amount)FROMorder)");```但是注意,这个子查询可能效率不高,而且不同数据库的语法可能略有不同。总结:apply方法是一个强大的工具,用于构建复杂的SQL条件,尤其是需要数据库函数或子查询的情况。</think>### MyBatis-Plus apply方法使用详解 在MyBatis-Plus中,`apply()`方法用于动态拼接自定义SQL片段到查询条件中,特别适合处理需要数据库函数或复杂表达式的场景[^1]。该方法通过占位符`{index}`安全传递参数,有效防止SQL注入。 #### 核心语法 ```java apply(String applySql, Object... params) ``` - **applySql**:包含占位符`{0}`, `{1}`的SQL片段 - **params**:按顺序替换占位符的参数值 #### 使用示例 **场景1:日期格式化查询** 查询2023年10月8日的订单: ```java QueryWrapper<Order> wrapper = new QueryWrapper<>(); wrapper.apply("DATE_FORMAT(create_time, '%Y-%m-%d') = {0}", "2023-10-08"); ``` 生成SQL: ```sql WHERE DATE_FORMAT(create_time, '%Y-%m-%d') = '2023-10-08' ``` **场景2:数学函数计算** 查询价格超过平均价150%的商品: ```java wrapper.apply("price > (SELECT AVG(price) * {0} FROM product)", 1.5); ``` **场景3:复杂条件组合** 查询特定状态且创建时间在指定范围的用户: ```java wrapper.eq("status", 1) .apply("create_time BETWEEN {0} AND {1}", "2023-01-01", "2023-12-31"); ``` #### 注意事项 1. **占位符顺序**:`{0}`对应第一个参数,`{1}`对应第二个参数 2. **安全注入**:参数值自动进行预编译处理,避免SQL注入 3. **函数兼容性**:确保使用的数据库函数(如`DATE_FORMAT`)与当前数据库兼容 4. **组合查询**:可与其他条件方法(如`eq()`, `gt()`)链式调用[^2] #### 性能优化建议 - 对`apply()`中的字段添加数据库索引 - 避免在`apply()`中使用全表扫描的子查询 - 复杂场景可结合`@Select`注解实现XML映射[^4] > 通过`apply()`方法,开发者能在不编写XML的情况下安全实现动态SQL拼接,特别适合处理带数据库函数的查询条件[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值