• 关于Mybatis的几个问题


    今天在用mybatis开发的时候遇到两个问题,下面一一列出并给出解决方案。

    问题一

    最开始我设置的实体类中有个字段如isParent为boolean类型,set和get方法是eclispe自动生成的。

        private boolean isParent;
    
        public boolean isParent() {
            return isParent;
        }
    
        public void setParent(boolean isParent) {
            this.isParent = isParent;
        }    

    在xml中是这么写的

    <select id="getChildrenByParentId" parameterType="java.lang.String" resultType="org.sjzcgl.common.data.CommonTree">
            SELECT ID,
                   NAME,
                   CASE
                     WHEN EXISTS (SELECT 1 FROM TREE_YJS A WHERE A.PARENT_ID = T.ID) THEN
                      '1'
                     ELSE
                      '0'
                   END isParent,
                   PARENT_ID parentId,
                   IS_METADATA_TYPE isMetadataType,
                   SFYX
              FROM TREE_YJS T
              WHERE T.SFYX = '1'
                <if test="_parameter != null and _parameter != ''">
                    AND T.PARENT_ID = #{0,jdbcType=VARCHAR}
                </if>
                <if test="_parameter == null or _parameter == ''">
                    AND T.PARENT_ID IS NULL
                </if>
        </select>

    其中CASE WHEN EXISTS (SELECT 1 FROM TREE_YJS A WHERE A.PARENT_ID = T.ID) THEN '1' ELSE '0' END isParent ,对于isParent这个字段无论是返回的是字符串‘1’、‘0‘,还是数字1、0,又或者直接是true、false都不能转换为booean。

    解决方案:将isParent修改为String类型,并且修改get方法。

     

        private String isParent;
    
        public void setParentId(String parentId) {
            this.parentId = parentId;
        }
                
        public boolean getIsParent() {
            if(this.isParent.equals("1"))
                return true;
            else
                return false;
        }

     

    问题二

    还是这个xml,入参是String类型,但是在<if>标签里面(红色部分)不识别。

     

        <select id="getChildrenByParentId" parameterType="java.lang.String" resultType="org.sjzcgl.common.data.CommonTree">
            SELECT ID,
                   NAME,
                   CASE
                     WHEN EXISTS (SELECT 1 FROM TREE_YJS A WHERE A.PARENT_ID = T.ID) THEN
                      '1'
                     ELSE
                      '0'
                   END isParent,
                   PARENT_ID parentId,
                   IS_METADATA_TYPE isMetadataType,
                   SFYX
              FROM TREE_YJS T
              WHERE T.SFYX = '1'
                <if test="parentId != null and parentId != ''">
                    AND T.PARENT_ID = #{0,jdbcType=VARCHAR}
                </if>
                <if test="parentId == null or parentId == ''">
                    AND T.PARENT_ID IS NULL
                </if>
        </select>

     

    解决方案:后来查到原因,在mybatis中String参数只用了一次,就不会报错,如果第二段代码还用来判断了不为空,多次使用的话,它就会报错,经更改之后的代码如下,将参数改为_parameter,这样它就会知道,你一直使用的都是传进来的String。

     

        <select id="getChildrenByParentId" parameterType="java.lang.String" resultType="org.sjzcgl.common.data.CommonTree">
            SELECT ID,
                   NAME,
                   CASE
                     WHEN EXISTS (SELECT 1 FROM TREE_YJS A WHERE A.PARENT_ID = T.ID) THEN
                      '1'
                     ELSE
                      '0'
                   END isParent,
                   PARENT_ID parentId,
                   IS_METADATA_TYPE isMetadataType,
                   SFYX
              FROM TREE_YJS T
              WHERE T.SFYX = '1'
                <if test="_parameter != null and _parameter != ''">
                    AND T.PARENT_ID = #{0,jdbcType=VARCHAR}
                </if>
                <if test="_parameter == null or _parameter == ''">
                    AND T.PARENT_ID IS NULL
                </if>
        </select>

     

     

     

     

    身体是革命的本钱,爱跑步,爱生活!
  • 相关阅读:
    maven项目添加Gson的依赖后无法启动,报错BeanCreationException:Error creating bean with name 'gsonBuilder'
    'bool' object is not callable
    UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence
    django.contrib.auth.middleware.AuthenticationMiddleware' must be in MIDDLEWARE in order to use the admin application.
    ForeignKey(unique=True) is usually better served by a OneToOneField.
    NameError: name 'reload' is not defined
    No module named 'django.core.urlresolvers'
    No module named 'ckeditor'
    [Docker] Leverage a Docker Maven plugin
    [Docker] Separate application image from database migration
  • 原文地址:https://www.cnblogs.com/caozx/p/8858171.html
Copyright © 2020-2023  润新知