布尔值未在 Hibernate 中与 MySQL 正确映射

Posted

技术标签:

【中文标题】布尔值未在 Hibernate 中与 MySQL 正确映射【英文标题】:Boolean value not getting mapped properly in Hibernate with MySQL 【发布时间】:2016-08-27 21:49:48 【问题描述】:

我正在尝试通过 resultSetTransformermysql 数据库中的存在查询(返回 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 正确映射的主要内容,如果未能解决你的问题,请参考以下文章

道具值未在 vuejs 中呈现

长 URL 值未在 Codeigniter 中提交

反应:useContext 值未在嵌套函数中更新

C ++ #define值未在cpp文件中读取

IBInspectable 属性值未在 xib 中更新

导航栏 Alpha 值未在 iOS 7 中设置