在mybatis中mapper.xml中如何实现sql动态条件查询结果后求和

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在mybatis中mapper.xml中如何实现sql动态条件查询结果后求和相关的知识,希望对你有一定的参考价值。

现在遇到个状况,如下代码
select
rela.member_paper_id,rela.member_id,paper_type,rela.paper_id,rela.create_time,rela.update_time,rela.start_time,rela.end_time,me.member_name,pa.paper_name,concat (rela.paper_score ,'分' ) as paper_score,concat (pa.total_score ,'分' ) as total_score,
cast((
select count(1) from
training_member_paper_question_relation qrela
left join training_member_paper_relation mpr on qrela.member_paper_id = mpr.member_paper_id
where
qrela.member_paper_id = rela.member_paper_id and is_correct = '0'
) as char(5))as error_number,
cast((
select
SUM(d.question_score)
from
(select qrela.question_score from training_member_paper_question_relation qrela
left join training_paper_question que on qrela.question_id = que.question_id
where qrela.member_paper_id = '2017110900011225' and (que.question_type = 'single' or que.question_type = 'order' or que.question_type = 'multiple')
)as d
) as char(5)) as subjective_score,
cast((
select
COUNT(1)
from training_member_paper_question_relation qrela
left join training_paper_question que on qrela.question_id = que.question_id
where qrela.member_paper_id = rela.member_paper_id and (que.question_type = 'single' or que.question_type = 'order' or que.question_type = 'multiple')
) as char(5))as subjective_item
from
training_member_paper_relation rela
left join training_member me on rela.member_id = me.member_id
left join training_paper pa on rela.paper_id = pa.paper_id
WHERE rela.member_paper_id = '2017110900011225'
在这种情况下是可以查出member_paper_id = '2017110900011225'的数据,这个没问题,但我的WHERE条件后的rela.member_paper_id 在mapper是动态的(= #memberPaperId,jdbcType=CHAR) ,那么在上面 qrela.member_paper_id 就不可能为= '2017110900011225'不变的,但是我把它改成像下面一个字段的方式: qrela.member_paper_id = rela.member_paper_id 直接报错[Err] 1054 - Unknown column 'rela.member_paper_id' in 'where clause',
subjective_score字段的查询是先查出条件下的结果,再把结果求和,再把这个作为一个字段去查询,下面一个 subjective_item字段查询是直接查出数量,再作为一个字段查询,这个是没有问题的,请问大神这个有没有什么办法啊

参考技术A mybatis配置可以在任何时候打印SQL ,应该把所有的配置都改为DEBUG模式。

# This is the configuring for logging displayed in the Application Server
log4j.rootCategory=DEBUG,stdout,logfile
log4j.logger.java.sql.PreparedStatement=debug,stdout
log4j.logger.java.sql.ResultSet=debug

#stdout configure
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %d %p [%c] - <%m>%n

如何在xml中传入list参数

 

 

mapper.xml文件

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxx.xx.cms.dal.extdao.GroupByMaterialMapper">

    <select id="groupByMaterialIds" resultType="com.xxx.xx..cms.dal.extdomain.GroupByMaterialDO">
        select t1.material_id AS materialId, t2.material_name AS materialName,
        t2.material_type AS materialType, t1.position_id AS positionId,
        t5.position_name AS positionName, t1.project_id AS projectId,
        t3.project_name AS projectName, t1.task_id AS taskId,t4.task_name AS taskName
        from xspace_task_material_pre t1
        left join xspace_material_pre t2 on t1.material_id = t2.id
        left join xspace_delivery_project_pre t3 on t1.project_id = t3.id
        left join xspace_delivery_task_pre t4 on t1.task_id = t4.id
        left join xspace_content_position_pre t5 on t1.position_id = t5.id
        <where>
            t1.material_id in
            <foreach close=")" collection="materialIds" item="listItem" open="(" separator=",">
                #{listItem}
            </foreach>
        </where>
        order BY t1.material_id
    </select>

</mapper>

 

 

mapper.java文件

import com.xxx.xx.cms.dal.extdomain.GroupByMaterialDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 *
 * @author 
 * @version 2017/12/5 17:38:29
 */
@Mapper
public interface GroupByMaterialMapper {

    /**
     *
     *
     * @param materialIds
     * @return
     */
    List<GroupByMaterialDO> groupByMaterialIds(@Param("materialIds") List<Long> materialIds);
}

 

以上是关于在mybatis中mapper.xml中如何实现sql动态条件查询结果后求和的主要内容,如果未能解决你的问题,请参考以下文章

mybatis中dao接口与mapper关联的理解

MyBatis 的mapper.xml配置的问题

通用Mapper

mybatis mapper.xml中如何表示字符串

一个mybatis的mapper.xml文件,如何被其他的mapper.xml引用?

Mybatis小结之详解Mapper.xml