mybatisplus中可以在left join 后加入if标签进行动态sql处理吗
时间: 2024-02-12 11:02:50 浏览: 223
是的,MyBatis-Plus 也支持在 left join 后面加入 if 标签进行动态 SQL 处理。可以像下面这样使用:
```xml
<select id="getUserList" resultMap="userResultMap">
SELECT u.id, u.username, r.name
FROM user u
LEFT JOIN role r ON u.role_id = r.id
<if test="condition">
WHERE u.status = #{condition}
</if>
</select>
```
在上面的示例中,如果传入的 `condition` 参数不为空,则会在 SQL 查询语句中添加一个 `WHERE` 子句,用于筛选状态为 `condition` 的用户。如果 `condition` 参数为空,则不会添加 `WHERE` 子句。
需要注意的是,如果使用 MyBatis-Plus 提供的 `leftJoin()` 方法进行 left join 操作,则需要使用 `on()` 方法指定连接条件,而不能在后面加入 if 标签。因为 `leftJoin()` 方法返回的是一个 `QueryWrapper` 对象,而不是一个 SQL 语句字符串。
相关问题
把这段sql代码转换mybatisplus代码:SELECT p.id, p.identifier,c.company_order,p.business_source,p.salesmen,p.charge,p.contract_sign_date,p.total_money,IFNULL(pa.invoice_money,0.00) invoice_money,IF(pa.invoice_money IS NULL,p.total_money,p.total_money-pa.invoice_money) invoice_money_notready,IFNULL(pa.invoice_money_rate,0.00) invoice_money_rate FROM `ly_project` p LEFT JOIN `ly_project_amount` pa ON pa.project_id = p.id LEFT JOIN `ly_contract` c ON c.id = p.contract_id WHERE p.identifier LIKE '%2305106%' AND c.company_order LIKE '%海量%' ORDER BY p.contract_sign_date
以下是将 SQL 代码转换为 MyBatis Plus 代码的示例:
```java
QueryWrapper<Project> queryWrapper = new QueryWrapper<>();
queryWrapper.select("p.id", "p.identifier", "c.company_order", "p.business_source", "p.salesmen", "p.charge", "p.contract_sign_date", "p.total_money", "IFNULL(pa.invoice_money,0.00) invoice_money", "IF(pa.invoice_money IS NULL,p.total_money,p.total_money-pa.invoice_money) invoice_money_notready", "IFNULL(pa.invoice_money_rate,0.00) invoice_money_rate")
.eq("p.identifier", "%2305106%")
.like("c.company_order", "海量")
.orderByAsc("p.contract_sign_date")
.leftJoin(ProjectAmount.class, "pa", "pa.project_id = p.id")
.leftJoin(Contract.class, "c", "c.id = p.contract_id");
List<Project> projectList = projectMapper.selectList(queryWrapper);
```
这段代码中,我们使用了 MyBatis Plus 提供的 `QueryWrapper` 类来构造查询条件,使用 `select` 方法来指定需要查询的字段,使用 `eq` 和 `like` 方法来添加查询条件,使用 `orderByAsc` 方法来指定排序方式,使用 `leftJoin` 方法来添加左连接的表和连接条件。最后,我们调用 `selectList` 方法来执行查询,并将结果保存在 `projectList` 变量中。
mybatisplus page关联查询
MyBatis-Plus是MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,方便开发者快速、高效地使用MyBatis进行开发。其中,MyBatis-Plus的分页查询非常方便,可以结合关联查询一起使用。
在MyBatis-Plus中,可以使用Page对象来进行分页查询。如果需要进行关联查询,可以使用MyBatis的XML配置文件或注解方式进行SQL语句编写。例如,在XML配置文件中,可以使用`<select>`标签来定义SQL语句,并使用`<resultMap>`标签来定义结果集映射。在关联查询中,可以使用`<association>`或`<collection>`标签来定义关联关系。
在代码中,可以使用MyBatis-Plus的`com.baomidou.mybatisplus.extension.plugins.pagination.Page`类来创建分页查询对象,并调用`com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage()`方法进行分页查询。在方法参数中,需要传入`com.baomidou.mybatisplus.extension.plugins.pagination.Page`对象和查询条件参数。
例如,假设有两个表t_user和t_order,t_user表中包含用户信息,t_order表中包含订单信息。如果需要查询用户信息以及对应的订单信息,可以使用如下代码实现:
```java
Page<UserOrderVO> page = new Page<>(1, 10); // 创建分页查询对象
QueryWrapper<User> queryWrapper = new QueryWrapper<>(); // 创建查询条件参数对象
queryWrapper.eq("user_id", userId); // 设置查询条件
List<UserOrderVO> userOrderVOList = userMapper.selectUserOrderPage(page, queryWrapper); // 执行分页查询
```
其中,UserOrderVO是自定义的VO类,用于封装用户信息和订单信息。在userMapper接口中定义如下方法:
```java
List<UserOrderVO> selectUserOrderPage(Page<UserOrderVO> page, @Param(Constants.WRAPPER) Wrapper<User> wrapper);
```
在Mapper.xml配置文件中定义如下SQL语句:
```xml
<select id="selectUserOrderPage" resultMap="userOrderResultMap">
SELECT u.*, o.*
FROM t_user u
LEFT JOIN t_order o ON u.user_id = o.user_id
WHERE 1=1
<if test="ew != null">
<if test="ew.sqlSegment != null and ew.sqlSegment != ''">
${ew.sqlSegment}
</if>
</if>
</select>
<resultMap id="userOrderResultMap" type="com.example.vo.UserOrderVO">
<id column="user_id" property="userId"/>
<result column="user_name" property="userName"/>
<result column="order_id" property="orderId"/>
<result column="order_name" property="orderName"/>
</resultMap>
```
其中,${ew.sqlSegment}是MyBatis-Plus提供的动态SQL语句拼接方式。
阅读全文