mybatis关联表查询异常

有两张表关联,一张为老师(teacher)表,一张为学院(college表),teacher表中有学院表外键collegeId,根据条件查询时,报出一下异常提示:

org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column 'T.ORIFIN' in 'field list'
### The error may exist in file [F:\Download\myGitHub\xhu\yuesuke\target\classes\mapper\teachersMapper.xml]
### The error may involve com.domain.Teachers.findByCondition-Inline
### The error occurred while setting parameters
### SQL: SELECT T.ID T_ID,T.NAME T_NAME,T.SEX T_SEX,T.AGE T_AGE,T.ORIFIN T_ORIFIN,T.NATION T_NATION,T.ID_NUMBER T_ID_NUMBER,T.PHONE T_PHONE,T.SALARY T_SALARY,T.SAVE_TIME T_SAVE_TIME,T.UPDATE_TIME T_UPDATE_TIME,T.COLLEGE_ID T_COLLEGE_ID,T.JOB_TITLE_ID T_JOB_TITLE_ID,         CO.ID CO_ID,CO.NAME CO_NAME,CO.STUDENTS_NUMBER CO_STUDENTS_NUMBER,CO.TEACHERS_NUMBER CO_TEACHERS_NUMBER,CO.SAVE_TIME CO_SAVE_TIME,CO.UPDATE_TIME CO_UPDATE_TIME,         J.ID J_ID,J.JOB_NAME J_JOB_NAME         FROM teachers T         LEFT JOIN COLLEGE CO ON CO.ID=T.COLLEGE_ID         LEFT JOIN JOB_TITLE J ON J.ID=T.JOB_TITLE_ID
### Cause: java.sql.SQLSyntaxErrorException: Unknown column 'T.ORIFIN' in 'field list'

; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column 'T.ORIFIN' in 'field list'

查找很久后,发现是mybatis的mapper映射xml中的查询<select>中的字段与reslutMap中的字段不对应。原来是的mapper映射xml如下:

定义的结果集resulMap:

<resultMap id="teachersMap" type="com.domain.Teachers">
    <id property="id" column="ID"></id>
    <result property="name" column="NAME"></result>
    <result property="sex" column="SEX"></result>
    <result property="age" column="AGE"></result>
    <result property="origin" column="ORIGIN"></result>
    <result property="nation" column="NATION"></result>
    <result property="idNumber" column="ID_NUMBER"></result>
    <result property="phone" column="PHONE"></result>
    <result property="salary" column="SALARY"></result>
    <result property="saveTime" column="SAVE_TIME"></result>
    <result property="updateTime" column="UPDATE_TIME"></result>
    <association property="collegeId" column="COLLEGE_ID" javaType="com.domain.College">
        <id property="id" column="CO_ID"></id>
        <result property="name" column="CO_NAME"></result>
        <result property="studentsNumber" column="CO_STUDENTS_NUMBER"></result>
        <result property="teachersNumber" column="CO_TEACHERS_NUMBER"></result>
        <result property="saveTime" column="CO_SAVE_TIME"></result>
        <result property="updateTime" column="CO_UPDATE_TIME"></result>
    </association>
    <association property="jobTitleId" column="JOB_TITLE_ID" javaType="com.domain.JobTitle">
        <id property="id" column="J_ID"></id>
        <result property="jobName" column="J_JOB_NAME"></result>
    </association>
</resultMap>

根据条件查询SQL:

<select id="findByCondition" parameterType="java.util.Map" resultMap="teachersMap">
    SELECT T.ID T_ID,T.NAME T_NAME,T.SEX T_SEX,T.AGE T_AGE,T.ORIFIN T_ORIFIN,T.NATION T_NATION,T.ID_NUMBER T_ID_NUMBER,T.PHONE T_PHONE,T.SALARY T_SALARY,T.SAVE_TIME T_SAVE_TIME,T.UPDATE_TIME T_UPDATE_TIME,T.COLLEGE_ID T_COLLEGE_ID,T.JOB_TITLE_ID T_JOB_TITLE_ID,
    CO.ID CO_ID,CO.NAME CO_NAME,CO.STUDENTS_NUMBER CO_STUDENTS_NUMBER,CO.TEACHERS_NUMBER CO_TEACHERS_NUMBER,CO.SAVE_TIME CO_SAVE_TIME,CO.UPDATE_TIME CO_UPDATE_TIME,
    J.ID J_ID,J.JOB_NAME J_JOB_NAME
    FROM teachers T
    LEFT JOIN COLLEGE CO ON CO.ID=T.COLLEGE_ID
    LEFT JOIN JOB_TITLE J ON J.ID=T.JOB_TITLE_ID
    <where>
        <if test="NAME != null">
            `NAME` LIKE #{NAME}
        </if>
        <if test="SEX != null">
            AND SEX=#{SEX}
        </if>
        <if test="ID_NUMBER != null">
            AND ID_NUMBER=#{ID_NUMBER}
        </if>
        <if test="SAVE_TIME != null">
            AND SAVE_TIME LIKE #{SAVE_TIME}
        </if>
    </where>
</select>

在上面的代码中有几个问题:

1、在<select>中对应表teachers中的字段如T_ID等,在其resultMap中是不存在的。原来的想法是本表的字段不修改,只用修改关联表college和job_title的字段即可,但是事实证明这种想法在定义的时候没什么问题,问题在于需要用到它的是时候,我却修改了本表的字段,导致找不到对应的字段而报sql异常。解决办法就是删掉<select>中的T_ID字段等,但是关联表的字段不应该修改。一句话就是:<select>和<resultMap>中的字段要完全对应。

2、第二个问题就是在<select>中的<where>中的条件'NAME'等没有指定其属性,意思就是没有指明它是属于哪一个表的字段,解决办法是:T.NAME,这样即可为其指定其从属表。

扫描二维码关注公众号,回复: 2508527 查看本文章

3、第三个问题是:如果没有后面的关联表的CO.ID CO_ID等,查询结果只有主表teacher的其他属性值,而关联外键即collegeId和jobTitleId的值为空,这是外键,其类型为对应的类,因此应该加上。

修改后的<select>为:

<select id="findByCondition" parameterType="java.util.Map" resultMap="teachersMap">
    SELECT T.ID,T.NAME,T.SEX,T.AGE,T.ORIGIN,T.NATION,T.ID_NUMBER,T.PHONE,T.SALARY,T.SAVE_TIME,T.UPDATE_TIME,T.COLLEGE_ID,T.JOB_TITLE_ID,
    CO.ID CO_ID,CO.NAME CO_NAME,CO.STUDENTS_NUMBER CO_STUDENTS_NUMBER,CO.TEACHERS_NUMBER CO_TEACHERS_NUMBER,CO.SAVE_TIME CO_SAVE_TIME,CO.UPDATE_TIME CO_UPDATE_TIME,
    J.ID J_ID,J.JOB_NAME J_JOB_NAME
    FROM teachers T
    LEFT JOIN COLLEGE CO ON CO.ID=T.COLLEGE_ID
    LEFT JOIN JOB_TITLE J ON J.ID=T.JOB_TITLE_ID
    <where>
        <if test="teacherName != null">
            AND T.`NAME` LIKE #{teacherName}
        </if>
        <if test="teacherSex != null">
            AND SEX=#{teacherSex}
        </if>
        <if test="teacherIdNumber != null">
            AND ID_NUMBER=#{teacherIdNumber}
        </if>
        <if test="teacherSaveTime != null">
            AND SAVE_TIME LIKE #{teacherSaveTime}
        </if>
    </where>
</select>

本篇文章为学习过程中遇到的问题以及解决方法,以备日后的查找和复习,也希望各位大佬指点。


猜你喜欢

转载自blog.csdn.net/qq_41221030/article/details/80214384