使用MySQL在Hibernate中无法正确映射布尔值

时间:2016-05-03 01:26:19

标签: java mysql hibernate jdbc boolean

我试图通过 resultSetTransformer 将存在的查询(返回TRUE / FALSE)的结果从MySQL数据库映射到POJO。我希望这个存在的查询的结果可以映射到一个布尔值,但它没有,并抛出以下错误:

  

org.hibernate.PropertyAccessException:IllegalArgumentException   在调用TestBean.value的setter时发生了

此异常的原因显示为:

  

java.lang.IllegalArgumentException:参数类型不匹配


我的样本班:

inputUppercase

POJO:

public class TestHibernate {

    private static SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

    public static void main(String[] args) throws ParseException {
        try {
            Query query = sessionFactory.openSession().createSQLQuery(
                "SELECT " +
                "EXISTS (SELECT * FROM A WHERE id = 3) AS value"
            );

            query.setResultTransformer(Transformers.aliasToBean(TestBean.class));
            List<TestBean> beanList = (List<TestBean>) query.list();
        } catch (Exception e) {
            System.out.println(e);
        }
    }

}

我是否遗漏了某些内容,或者它是Hibernate或MySQL JDBC Driver的错误?

Hibernate版本:3.2.6GA
MySQL JDBC驱动程序:mysql-connector-java-5.1.2

4 个答案:

答案 0 :(得分:0)

Hibernate有一个内置的“yes_no”类型,可以做你想要的。它映射到数据库中的CHAR(1)列。

基本映射:

<property name="some_flag" type="yes_no"/>

注释映射(Hibernate扩展):

@Type(type="yes_no")
public boolean getFlag();

答案 1 :(得分:0)

您的问题可能是由所选列q.v.的案例映射引起的。我的解决方案如下我还参数化了您的WHERE子句以避免SQL注入。

Query query = session.createSQLQuery("select exists(select * from A where id = :id) as value");
    .setParameter("id", "3");
    .addScalar("value")
    .setResultTransformer( Transformers.aliasToBean(TestBean.class))

List result = query.list();
TestBean theBean = (TestBean)result.get(0);

答案 2 :(得分:0)

结果查询的转换可以使用hibernate addScalar()方法将每个参数显式设置为相应的模型数据类型。请在下面找到解决方案。

    Query query = sessionFactory.openSession().createSQLQuery(""+
                "select " +
                " exists(select * from A where id = 3) as value"
                ).addScalar("value",  BooleanType.INSTANCE);

这将解析设置为布尔值。

答案 3 :(得分:0)

我知道这是陈旧的答案,我试图从这里解决这个问题的答案对我没用。

除了@anil bk的答案之外,我重载了一个接受String作为参数的setter方法。现在它按预期工作。

public void setPriority(String priority) {
    this.priority = "true".equals(priority);
}

这是我的answer

相关问题