布尔值未在 Hibernate 中与 MySQL 正确映射
Posted
技术标签:
【中文标题】布尔值未在 Hibernate 中与 MySQL 正确映射【英文标题】:Boolean value not getting mapped properly in Hibernate with MySQL 【发布时间】:2016-08-27 21:49:48 【问题描述】:我正在尝试通过 resultSetTransformer 将 mysql 数据库中的存在查询(返回 TRUE/FALSE)的结果映射到 POJO。我希望这个存在查询的结果可以映射到布尔值,但它不会并抛出以下错误:
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);
POJO:
public class TestBean
private boolean value;
public boolean isValue()
return value;
public void setValue(boolean value)
this.value = value;
是我遗漏了什么还是 Hibernate 或 MySQL JDBC 驱动程序的错误?
休眠版本:3.2.6GA MySQL JDBC 驱动:mysql-connector-java-5.1.2
【问题讨论】:
你这样做是不正确的。你想要一个原始查询吗?你想返回一个实体还是只返回一个对象列表?有太多的问题激励我给出答案,但是看看一个教程like this one。 我认为接受包含在列表中的原始查询返回的单个实体没有任何问题 即使TestBean与表无关,我们也可以做到——checkout :Transformers.aliasToBean" 方法 【参考方案1】:Hibernate 有一个内置的“yes_no”类型,可以做你想做的事。它映射到数据库中的 CHAR(1) 列。
基本映射:
<property name="some_flag" type="yes_no"/>
注解映射(Hibernate 扩展):
@Type(type="yes_no")
public boolean getFlag();
【讨论】:
我更关心为什么我应该这样做......休眠不应该像其他类型一样确定正确的类型并正确映射它吗?会等着看我是否对此有任何想法.. 这也给出了同样的错误。此外,我不确定存在查询的结果是否是 char(1) 列..【参考方案2】:您的问题可能是由所选列 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);
【讨论】:
不起作用.. 另外我认为这不是大小写问题,因为异常原因说参数“类型”不匹配。我还用这个细节更新了这个问题.. 把TestBean.value
改成一个整数看看会发生什么。【参考方案3】:
结果查询的转换可以使用 hibernate addScalar() 方法显式地将每个参数设置为相应的模型数据类型。请在下面找到解决方案。
Query query = sessionFactory.openSession().createSQLQuery(""+
"select " +
" exists(select * from A where id = 3) as value"
).addScalar("value", BooleanType.INSTANCE);
这将解析为设置为布尔值。
【讨论】:
【参考方案4】:我知道这是旧答案,我试图从这里解决这个问题,因为它对我不起作用。
除了来自@anil bk 的答案之外,我重载了一个接受String
作为参数的setter 方法。现在它按预期工作。
public void setPriority(String priority)
this.priority = "true".equals(priority);
这是我的answer
【讨论】:
以上是关于布尔值未在 Hibernate 中与 MySQL 正确映射的主要内容,如果未能解决你的问题,请参考以下文章