Spring JDBC BeanPropertyRowMapper是没有('Y','N')到布尔bean属性

时间:2013-03-14 14:19:40

标签: database oracle spring boolean spring-jdbc

我有一个包含一些字符串,int和boolean字段的类。我为他们宣布了吸气剂和制定者。

public class SomeClass {

    private int id;
    private String description;
    private boolean active;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public boolean isActive() {
        return active;
    }
    public void setActive(boolean active) {
        this.active = active;
    }


}

我是BeanPropertyRowMapper以从Oracle DB获取所有对象。

@Override
public List<Destination> getAll() {
     List<SomeClass> objs = jdbcTemplate.query(
                myQuery, new BeanPropertyRowMapper<SomeClass>(SomeClass.class));
     return objs;
}   

如果打开调试,我会看到:

[3/14/13 10:02:09:202 EDT] 00000018 SystemOut     O DEBUG BeanPropertyRowMapper - Mapping column 'ID' to property 'id' of type int
[3/14/13 10:02:09:202 EDT] 00000018 SystemOut     O DEBUG BeanPropertyRowMapper - Mapping column 'DESCRIPTION' to property 'description' of type class java.lang.String

然后它尝试映射活动失败。 Active在DB中定义为1字节CHAR,值为“Y”或“N”。使用BeanPropertyRowMapper并成功将“Y”和“N”等值转换为布尔值的最佳方法是什么?

4 个答案:

答案 0 :(得分:9)

所以我想出了如何做到这一点。我通过一些自定义代码扩展了BeanPropertyRowMapper和处理程序布尔类型,然后将控件移交给beanpropertyrowmapper以获取其余的数据类型。

注意:它对我有用,因为我使用oracle,所有'boolean'类型列都是'y','yes','n'和&amp;的字符串。 '不'类型值。

使用数字1,0或其他格式的人可以通过对象是地图使其成为通用并从结果集获取对象并在此地图中查找它们来进一步改进它。希望在像我这样的情况下帮助其他人。

import java.beans.PropertyDescriptor;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;

/**
 * Extends BeanPropertyRowMapper to allow for boolean fields
 * mapped to 'Y,'N' type column to get set correctly. Using stock BeanPropertyRowMapper
 * would throw a SQLException.
 * 
 */
public class ExtendedBeanPropertyRowMapper<T> extends BeanPropertyRowMapper<T> {

    //Contains valid true values
    public static final Set<String> TRUE_SET = new HashSet<String>(Arrays.asList("y", "yes", "true"));

    public ExtendedBeanPropertyRowMapper(Class<T> class1) {
        super(class1);
    }

    @Override
    /**
     * Override <code>getColumnValue</code> to add ability to map 'Y','N' type columns to
     * boolean properties.
     * 
     * @param rs is the ResultSet holding the data
     * @param index is the column index
     * @param pd the bean property that each result object is expected to match
     * (or <code>null</code> if none specified)
     * @return the Object value
     * @throws SQLException in case of extraction failure
     * @see org.springframework.jdbc.core.BeanPropertyRowMapper#getColumnValue(java.sql.ResultSet, int, PropertyDescriptor) 
     */
    protected Object getColumnValue(ResultSet rs, int index,
            PropertyDescriptor pd) throws SQLException {
        Class<?> requiredType = pd.getPropertyType();
        if (boolean.class.equals(requiredType) || Boolean.class.equals(requiredType)) {
            String stringValue = rs.getString(index);
            if(!StringUtils.isEmpty(stringValue) && TRUE_SET.contains(stringValue.toLowerCase())){
                return true;
            }
            else return false;
        }       
        return super.getColumnValue(rs, index, pd);
    }
}

答案 1 :(得分:3)

BeanPropertyRowMapper会将值转换为Boolean对象0=false1=true。刚试过这个就可以了。

This blog post提供了更多信息,以及Java和C中使用OCCI的代码示例。

答案 2 :(得分:1)

老问题,但你可以做类似

的事情
final String comment = URLEncoder.encode(commentContent.getText().toString().trim(), "UTF-8");
        final String name = URLEncoder.encode(commentName.getText().toString().trim(), "UTF-8");
        final String email = URLEncoder.encode(commentEmail.getText().toString().trim(), "UTF-8");

final String postComment = "https://blogurl.com/wp-json/wp/v2/comments?comment="+comment+"&name="+name+"&email="+email;

答案 3 :(得分:0)

正如Harikumar所指出的那样,BeanPropertyRowMapper确实将0和1转换为布尔值。我找不到任何支持这一点的文档,但实际上这是当前的情况。

因此,不要求您扩展BeanPropertyRowMapper的解决方案是将列解码为以下值:

@Override
public List<Destination> getAll() {
     List<SomeClass> objs = jdbcTemplate.query(
                "SELECT ID, DESCRIPTION, " +
                " DECODE(ACTIVE, 'Y', 1,'N', 0) as ACTIVE " +
                " FROM YOUR_TABLE",
                new BeanPropertyRowMapper<SomeClass>(SomeClass.class));
     return objs;
}