gpt4 book ai didi

java - MyBatis: boolean 参数:MyBatis 正在使用 Getter

转载 作者:行者123 更新时间:2023-12-01 10:22:23 31 4
gpt4 key购买 nike

主题:MyBatis:Boolean Paraeter:MyBatis 正在使用 Getter

内容:

大家好,

我一直在寻找解决我近乎简单的 MyBatis 问题的方法:

<小时/>

给定代码(仅必要部分):

mybatis-config.xml:

<?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:

<?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:

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:

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:

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);
}
<小时/>

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

NavigationDAO.findVisibleNavigations(true) // Or false.

抛出以下异常:

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”更改为“Map”,并将“resolve”替换为“param1”。但这也行不通。另外,如果我删除

<if test="..."> ... </if>

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

<小时/>

我对每一个答案都很满意。

感谢您的帮助费边

<小时/>

编辑 1:

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

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;
}
}

我忘了解释“resolve”的作用:它是一个简单的 boolean 值,用于标识是否加载 transient 属性。

最佳答案

在您的示例中,MyBatis 尝试对 boolean 参数调用 getResolve() (这显然不起作用),因为 Java 方法声明中的形式参数名称并未全部使用,因此您的“xml 中的“resolve”与参数名称“resolve”不匹配。

要为您的参数指定 MyBatis 名称resolve,请在您的 NavigationDAO.xml 中选择 parameterType="map":

...
<select id="findVisibleNavigations" parameterType="map" resultMap="navigationResultMap">
...
<select id="findHiddenNavigations" parameterType="map" resultMap="navigationResultMap">

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

....
SortedSet<Navigation> findVisibleNavigations(@Param("resolve") final boolean resolve);
SortedSet<Navigation> findHiddenNavigations(@Param("resolve") final boolean resolve);
...

更新1:

根据this description你可能会留下parameterType,但我从来没有使用过它。

关于java - MyBatis: boolean 参数:MyBatis 正在使用 Getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35495314/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com