Java 使用MySQL在Hibernate中未正确映射布尔值
我试图通过resultSetTransformer将一个exists查询(返回TRUE/FALSE)的结果从MySQL数据库映射到POJO。我希望此exists查询的结果可以映射到布尔值,但它没有,并抛出以下错误: org.hibernate.PropertyAccessException:IllegalArgumentException 调用TestBean.value的setter时发生 此异常的原因如下所示: java.lang.IllegalArgumentException:参数类型不匹配Java 使用MySQL在Hibernate中未正确映射布尔值,java,mysql,hibernate,jdbc,boolean,Java,Mysql,Hibernate,Jdbc,Boolean,我试图通过resultSetTransformer将一个exists查询(返回TRUE/FALSE)的结果从MySQL数据库映射到POJO。我希望此exists查询的结果可以映射到布尔值,但它没有,并抛出以下错误: org.hibernate.PropertyAccessException:IllegalArgumentException 调用TestBean.value的setter时发生 此异常的原因如下所示: java.lang.IllegalArgumentException:参数类型不
我的示例类:
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驱动程序的错误
Hibernate版本:3.2.6GAMySQL-JDBC驱动程序:MySQL-connector-java-5.1.2Hibernate有一个内置的“yes\u no”类型,可以执行您想要的操作。它映射到数据库中的CHAR(1)列 基本映射:
<property name="some_flag" type="yes_no"/>
您的问题可能是由所选列的案例映射引起的,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);
可以使用hibernate addScalar()方法将结果查询的转换显式地将每个参数设置为相应的模型数据类型。请在下面找到解决方案
Query query = sessionFactory.openSession().createSQLQuery(""+
"select " +
" exists(select * from A where id = 3) as value"
).addScalar("value", BooleanType.INSTANCE);
这将解析为设置为布尔值。我知道这是一个旧答案,我尝试从这里解析这个答案,因为它对我不起作用 除了@anil bk的答案之外,我重载了一个setter方法,该方法接受
String
作为参数。现在它如预期的那样工作
public void setPriority(String priority) {
this.priority = "true".equals(priority);
}
这是我的你在胡乱处理这件事。您想要原始查询吗?要返回实体还是仅返回对象列表?有太多的问题促使我给出答案,但请看一看教程。我认为接受原始查询返回的单个实体(包装在列表中)没有任何错误,我们可以这样做,即使TestBean与表签出无关-Transformers.aliasToBean“我更关心的是我为什么要这样做。。。难道hibernate不应该像对待其他类型那样,确定正确的类型并正确地映射它吗?我将等待,看看我是否对此有任何想法..这也给出了相同的错误。此外,我不确定exists查询的结果是否为char(1)列..不起作用。。此外,我认为这不是大小写问题,因为异常原因表示参数“类型”不匹配。我还用这个细节更新了这个问题。将
TestBean.value
更改为整数,看看会发生什么。
Query query = sessionFactory.openSession().createSQLQuery(""+
"select " +
" exists(select * from A where id = 3) as value"
).addScalar("value", BooleanType.INSTANCE);
public void setPriority(String priority) {
this.priority = "true".equals(priority);
}