首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MyBatis:布尔参数: MyBatis正在使用Getter

MyBatis:布尔参数: MyBatis正在使用Getter
EN

Stack Overflow用户
提问于 2016-02-19 00:43:32
回答 3查看 9.2K关注 0票数 1

主题: MyBatis:布尔Paraeter: MyBatis正在使用Getter

内容:

大家好,

我已经寻找了一段时间来解决我近乎简单的MyBatis问题:

给定的代码(只有必要的部分):

Mybati-config.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <!-- Model types. -->
        <typeAlias type="com.blockhaus2000.bh2k.portal.data.model.Navigation" alias="Navigation" />
        <!-- ... more types ... --->
    </typeAliases>
    <mappers>
        <mapper resource="mapper/NavigationDAO.xml" />
        <!-- ... more mappers ... -->
    </mappers>
</configuration>

NavigationDAO.xml:

代码语言:javascript
复制
<?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.blockhaus2000.bh2k.portal.data.dao.NavigationDAO">
    <resultMap type="Navigation" id="navigationResultMap">
        <id property="id" column="navigationId" />
        <result property="title" column="navigationTitle" />
        <result property="order" column="navigationOrder" />
        <result property="visible" column="navigationVisible" />
        <discriminator javaType="String" column="resolve">
            <case value="yes" resultMap="enhancedNavigationResultMap" />
        </discriminator>
    </resultMap>
    <resultMap type="Navigation" id="enhancedNavigationResultMap" extends="navigationResultMap">
        <collection property="navigationEntries" ofType="NavigationEntry">
            <id property="navigationId" column="navigationId" />
            <id property="pageId" column="pageId" />
            <result property="title" column="navigationEntryTitle" />
            <result property="order" column="navigationEntryOrder" />
            <result property="visible" column="navigationEntryVisible" />
        </collection>
    </resultMap>

    <!-- Methods from BaseDAO. -->
    <insert id="insert" parameterType="Navigation" useGeneratedKeys="true" keyProperty="id" keyColumn="navigationId">
        <!-- SQL -->
    </insert>
    <insert id="save" parameterType="Navigation">
        <!-- SQL -->
    </insert>
    <delete id="delete" parameterType="Navigation">
        <!-- SQL -->
    </delete>
    <select id="exists" parameterType="Navigation" resultType="boolean">
        <!-- SQL -->
    </select>

    <!-- Methods from UpdateableDAO. -->
    <update id="update" parameterType="Navigation">
        <!-- SQL -->
    </update>

    <!-- Methods from NavigationDAO. -->
    <select id="findVisibleNavigations" parameterType="boolean" resultMap="navigationResultMap">
        SELECT
            N.navigationId,
            N.navigationTitle,
            N.navigationOrder,
            N.navigationVisible,
        <if test="resolve">
            NE.pageId,
            NE.navigationEntryTitle,
            NE.NavigationEntryOrder,
            NE.navigationEntryVisible,
        </if>
            IF (
                #{resolve} = 'true',
                'yes',
                'no'
            ) AS resolve
        FROM
            Navigation AS N
        <if test="resolve">
        INNER JOIN NavigationEntry AS NE ON N.navigationId = NE.navigationId
        </if>
        WHERE
            N.navigationVisible = TRUE
        <if test="resolve">
            AND
            NE.navigationEntryVisible = TRUE
            AND
            NE.navigationEntryTitle IS NOT NULL
        </if>
    </select>
    <select id="findHiddenNavigations" parameterType="boolean" resultMap="navigationResultMap">
        <!-- SQL -->
    </select>
    <select id="findNavigation" parameterType="Map" resultMap="navigationResultMap">
        <!-- SQL -->
    </select>
</mapper>

NavigationDAO.java:

代码语言:javascript
复制
package com.blockhaus2000.bh2k.portal.data.dao;

import java.util.SortedSet;

import com.blockhaus2000.bh2k.portal.data.model.Navigation;

public interface NavigationDAO extends BaseDAO<Navigation>, UpdateableDAO<Navigation> {
    SortedSet<Navigation> findVisibleNavigations(final boolean resolve);

    SortedSet<Navigation> findHiddenNavigations(final boolean resolve);

    Navigation findNavigation(final int id, final boolean resolve);
}

BaseDAO.java:

代码语言:javascript
复制
package com.blockhaus2000.bh2k.portal.data.dao;

import com.blockhaus2000.bh2k.portal.data.model.BaseModel;

public interface BaseDAO<T extends BaseModel<T>> {
    int insert(final T obj);

    int save(final T obj);

    int delete(final T obj);

    boolean exists(final T obj);
}

UpdateableDAO.java:

代码语言:javascript
复制
package com.blockhaus2000.bh2k.portal.data.dao;

import com.blockhaus2000.bh2k.portal.data.model.BaseModel;

public interface UpdateableDAO<T extends BaseModel<T>> extends BaseDAO<T> {
    int update(final T obj);
}

一切都正常启动,但在调用

代码语言:javascript
复制
NavigationDAO.findVisibleNavigations(true) // Or false.

引发以下异常:

代码语言:javascript
复制
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'resolve' in 'class java.lang.Boolean'
    at org.mybatis.(...)
    at org.apache.ibatis.(...)
    at com.blockhaus2000.bh2k.portal.data.test.NavigationDAOSpec.test findVisibleNavigations(NavigationDAOSpec.groovy:224)
Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'resolve' in 'class java.lang.Boolean'
    at org.apache.ibatis.(...)
    at org.mybatis.(...)
    ... 5 more

尽管如此,解决方案可能是将"parameterType“更改为”映射“,并将”解决“替换为"param1”。但这也不起作用。另外,如果我移除

代码语言:javascript
复制
<if test="..."> ... </if>

它确实正确地执行(当然,除了功能之外)。

我对每一个答案都感到高兴。

谢谢你的帮助法比安

编辑1

以下是我的“导航”数据模型:

代码语言:javascript
复制
package com.blockhaus2000.bh2k.portal.data.model;

import java.util.SortedSet;

public class Navigation implements BaseModel<Navigation>, Comparable<Navigation> {
    private static final long serialVersionUID = 4019792023891297733L;

    /**
     * <p>
     * <b> PRIMARY KEY </b>
     * <br>
     * <b> AUTO_INCREMENT </b>
     * </p>
     */
    private int id = -1;
    private String title;
    private int order;
    private boolean visible;

    // ~ non-persistent fields ~

    private transient SortedSet<NavigationEntry> navigationEntries;

    // compateTo()
    // toString()
    // hashCode()
    // equals(Object)

    public int getId() {
        return this.id;
    }

    public String getTitle() {
        return this.title;
    }

    public int getOrder() {
        return this.order;
    }

    public boolean isVisible() {
        return this.visible;
    }

    public SortedSet<NavigationEntry> getNavigationEntries() {
        return this.navigationEntries;
    }

    public Navigation setId(final int id) {
        this.id = id;

        return this;
    }

    public Navigation setTitle(final String title) {
        this.title = title;

        return this;
    }

    public Navigation setOrder(final int order) {
        this.order = order;

        return this;
    }

    public Navigation setVisible(final boolean visible) {
        this.visible = visible;

        return this;
    }

    public Navigation setNavigationEntries(final SortedSet<NavigationEntry> navigationEntries) {
        this.navigationEntries = navigationEntries;

        return this;
    }
}

我忘了解释“解决”是什么:它是一个简单的布尔值,用于标识是否加载瞬态属性。

EN

回答 3

Stack Overflow用户

发布于 2016-02-19 07:08:04

在示例中,MyBatis尝试对布尔参数(显然不能工作)调用getResolve(),因为您的Java声明中的形式参数的名称没有全部使用,因此您在xml中的“解析”与参数名称“解析”不匹配。

若要给参数MyBatis名称resolve,请在NavigationDAO.xml中选择parameterType="map"

代码语言:javascript
复制
...
<select id="findVisibleNavigations" parameterType="map" resultMap="navigationResultMap">
...
<select id="findHiddenNavigations" parameterType="map" resultMap="navigationResultMap">

并在NavigationDAO.java中用@Param("resolve")注释您的参数,也许您必须删除final,但我不确定:

代码语言:javascript
复制
....
SortedSet<Navigation> findVisibleNavigations(@Param("resolve") final boolean resolve);
SortedSet<Navigation> findHiddenNavigations(@Param("resolve") final boolean resolve);
...

更新1:

根据这一描述的说法,你可能会离开parameterType,但我从未使用过。

票数 1
EN

Stack Overflow用户

发布于 2018-09-11 11:57:43

您只需从select语句中删除parameterType="boolean"即可。然后,#{resolve}参数(或任何名称)将使用实际的布尔值。指定parameterType会强制Mybatis在参数中查找resolve属性。实际上,它只适用于复杂类型。

或者,通过在mapper接口中使用注释@Param("resolve")来命名参数也将完成这项工作。

票数 0
EN

Stack Overflow用户

发布于 2019-07-05 08:57:28

您可以将#{论断}回复到#{1},也可以使用注释@Param(“解决”)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35495314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档