5

有没有更清洁的方法来做下一个:

<select id="getWithQueryData" resultMap="usuarioResult" parameterType="my.QueryData" >
select * from t_user 
 <if test="fieldName != null and ascDesc != null">
    order by
        <choose>  
            <when test="fieldName == 'name'">
                c_name 
            </when>         
            <when test="fieldName == 'lastName'">
                c_last_name 
            </when> 
            <when test="fieldName == 'email'">
                c_email 
            </when> 
            <when test="fieldName == 'password'">
                c_password 
            </when> 
            <when test="fieldName == 'age'">
                i_age
            </when>                                                             
        </choose>               
        <if test="ascDesc == 'asc'">
            asc 
        </if>            
        <if test="ascDesc == 'desc'">
            desc 
        </if>   
 </if>
limit #{limit} offset #{offset};

正如您可以推断的那样,QueryData 看起来像:

public class FiltroBusquedaVO {

private Integer offset;
private Integer limit;
private String fieldName;
private String ascDesc; ... }

如果我能得到一个给定字段名的列名,那就太好了。我的意思是,结果图有这些信息。但似乎我无法从 xml 中获取它。

我的示例只有 5 个字段,但是 20 个字段呢?有没有另一种方法来做这个不那么冗长?

4

2 回答 2

1

请参阅我对类似问题的回答。

Mybatis 将属性映射到列

但是唯一的缺点是你的java代码会知道列名。

于 2013-01-28T05:58:57.667 回答
1

我是这样做的:

List<ProjectLockDBO> getProjectsLocks(@Param("projectId") Integer projectId, @Param("userId") Integer userId, @Param("limit") Integer limit,
            @Param("offset") Integer offset, @Param("sortAsc") List<String> sortAsc, @Param("sortDesc") List<String> sortDesc);

<select id="getProjectsLocks" resultMap="ProjectLockResult">
        SELECT pl.id,
               pl.project_id,
               pl.notes,
               pl.created_by_id,
               pl.created_at,
               u.id AS user_id,
               u.email AS user_email,
               u.first_name AS user_first_name,
               u.last_name AS user_last_name
        FROM projects_locks pl
        LEFT JOIN users u ON u.id = pl.created_by_id
        WHERE 1=1
        <if test="projectId != null"> AND pl.project_id = #{projectId}</if>
        <if test="userId != null"> AND pl.created_by_id = #{userId}</if>
        <choose>
            <when test="sortAsc != null or sortDesc != null">
                ORDER BY <if test="sortAsc != null">
                    <foreach collection="sortAsc" item="element" open="" close=" ASC" separator=",">
                        ${element}
                    </foreach>
                </if>
                <if test="sortAsc != null and sortDesc != null">, </if>
                <if test="sortDesc != null">
                    <foreach collection="sortDesc" item="element" open="" close=" DESC" separator=",">
                        ${element}
                    </foreach>
                </if>
            </when>
            <otherwise>ORDER BY pl.id;</otherwise>
        </choose>
        <if test="limit != null">LIMIT #{limit}</if>
        <if test="offset != null">OFFSET #{offset}</if>
    </select>

其中 2 个列表将包含以下字符串:“pl.project_id”、“pl.id”、

这里的关键部分是 {element} 前面的美元符号“$”。如果您将使用标准#,它将无法正常工作。

于 2021-10-19T10:53:30.310 回答