我试图通过 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
答案 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