[英]MyBatis: Boolean Parameter: MyBatis is using Getter
主題:MyBatis:布爾參數: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”,並用“ param1”替換“ resolve”。 但這也不起作用。 另外,如果我刪除了
<if test="..."> ... </if>
它確實可以正確執行(當然,除了功能以外)。
我對每個答案都很滿意。
感謝您的幫助Fabian
編輯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;
}
}
我忘了解釋“解析”的作用:它是一個簡單的布爾值,用於標識是否加載瞬態屬性。
在您的示例MyBatis中,嘗試對boolean參數(顯然不起作用)調用getResolve()
,因為您的Java方法聲明中的形式參數名稱並未全部使用,因此xml中的“ resolve”與參數名稱不匹配“解決”。
為了讓您的參數MyBatis的名稱resolve
選擇parameterType="map"
在你的NavigationDAO.xml:
...
<select id="findVisibleNavigations" parameterType="map" resultMap="navigationResultMap">
...
<select id="findHiddenNavigations" parameterType="map" resultMap="navigationResultMap">
並使用@Param("resolve")
在NavigationDAO.java中注釋您的參數,也許您必須刪除final,但是我不確定:
....
SortedSet<Navigation> findVisibleNavigations(@Param("resolve") final boolean resolve);
SortedSet<Navigation> findHiddenNavigations(@Param("resolve") final boolean resolve);
...
更新1:
根據此描述,您可能會保留parameterType,但我從未使用過。
您應該只從select語句中刪除parameterType="boolean"
。 然后Mybatis將使用實際的布爾值作為參數#{resolve}
(或名稱)。 指定parameterType會強制Mybatis在參數中查找resolve
屬性。 實際上,只有復雜類型才需要它。
另外,通過在mapper界面中使用注解@Param("resolve")
來命名參數也可以完成此工作。
您可以將#{resolve}補充為#{1},或使用注釋@Param(“ resolve”)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.