Hibernate + Derby:不支持'BOOLEAN'和'INTEGER'之间的比较 [英] Hibernate + Derby: Comparisons between 'BOOLEAN' and 'INTEGER' are not supported

查看:354
本文介绍了Hibernate + Derby:不支持'BOOLEAN'和'INTEGER'之间的比较的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在查询Derby数据库时遇到问题。我正在使用Hibernate和JPA。问题与布尔列相关(可能)。每个查询以错误结束:



org.hibernate.exception.SQLGrammarException:不支持'BOOLEAN'和'INTEGER'之间的比较。类型必须具有可比性。字符串类型也必须具有匹配的排序规则。如果排序规则不匹配,则可能的解决方案是将操作数强制转换为默认排序规则(例如,SELECT tablename FROM sys.systables WHERE CAST(tablename AS VARCHAR(128))='T1')



您可以在下面找到示例代码和配置。样本被简化以便于阅读。这是我的JPA实体:

  @Entity 
公共抽象类任务实现Serializable {

@Id
@GeneratedValue(strategy = GenerationType.TABLE)
保护长ID;

@Column
保护布尔值已删除;

public long getId(){
return id;
}

public boolean isDeleted(){
return deleted;
}

public void setId(long id){
this.id = id;
}

public void setDeleted(boolean deleted){
this.deleted = deleted;
}

@Override
public int hashCode(){
return id;
}

@Override
public boolean equals(Object object){
if(object == null){
return false; $!


if(!this.getClass()。equals(object.getClass())){
return false;
}

EntityObject other =(EntityObject)对象;

if(this.id!= other.id){
return false;
}

返回true;
}

@Override
public String toString(){
returnEntityObject [id =+ id +];
}
}

我的JPA查询:

  SELECT t FROM任务t WHERE删除= false 

我的JPA配置:

 < persistence-unit name =PU1transaction-type =JTA > 
< provider> org.hibernate.ejb.HibernatePersistence< / provider>
< jta-data-source> jdbc / myapp< / jta-data-source>
< exclude-unlisted-classes> false< / exclude-unlisted-classes>
<属性>
< property name =hibernate.hbm2ddl.autovalue =update/>
< property name =hibernate.dialectvalue =org.hibernate.dialect.DerbyDialect/>
< / properties>
< / persistence-unit>

有什么不对?如何解决这个问题?感谢您的任何建议。

解决方案

降级没有帮助。这是适用于我的有效解决方案:

  import java.sql.Types; 
import org.hibernate.dialect.DerbyTenSevenDialect;

public class DerbyDialect extends DerbyTenSevenDialect {

public DerbyDialect(){
//修复Derby方言布尔数据类型映射错误
registerColumnType(Types.BOOLEAN , 整数);
}
}

我想最好配置'true'和'false'常量在方言中映射到Derby数据类型,但上面已经足够了。


I have a problem with querying Derby database. I am using Hibernate with JPA. Problem is related (probably) to boolean columns. Each query ends with error:

org.hibernate.exception.SQLGrammarException: Comparisons between 'BOOLEAN' and 'INTEGER' are not supported. Types must be comparable. String types must also have matching collation. If collation does not match, a possible solution is to cast operands to force them to the default collation (e.g. SELECT tablename FROM sys.systables WHERE CAST(tablename AS VARCHAR(128)) = 'T1')

Below you may find sample code and configuration. Samples are simplified for easier reading. Here is my JPA entity:

@Entity
public abstract class Task implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    protected long id;

    @Column
    protected boolean deleted;

    public long getId() {
        return id;
    }

    public boolean isDeleted() {
        return deleted;
    }

    public void setId(long id) {
        this.id = id;
    }

    public void setDeleted(boolean deleted) {
        this.deleted = deleted;
    }

    @Override
    public int hashCode() {
        return id;
    }

    @Override
    public boolean equals(Object object) {
        if (object == null) {
            return false;
        }

        if (!this.getClass().equals(object.getClass())) {
            return false;
        }

        EntityObject other = (EntityObject) object;

        if (this.id != other.id) {
            return false;
        }

        return true;
    }

    @Override
    public String toString() {
        return "EntityObject[ id=" + id + " ]";
    }
}

My JPA query:

SELECT t FROM Task t WHERE deleted = false

My JPA configuration:

<persistence-unit name="PU1" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/myapp</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
  <property name="hibernate.hbm2ddl.auto" value="update"/>
  <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/>
</properties>
</persistence-unit>

What is wrong? How to fix that? Thanks for any suggestions.

解决方案

Downgrade didn't helped. Here is valid solution which works for me:

import java.sql.Types;
import org.hibernate.dialect.DerbyTenSevenDialect;

public class DerbyDialect extends DerbyTenSevenDialect {

    public DerbyDialect() {
        // fix Derby dialect boolean data type mapping error
        registerColumnType(Types.BOOLEAN, "INTEGER");
    }
}

I guess it is better to configure 'true' and 'false' constants mapping in dialect to Derby data type, but above is good enough for now.

这篇关于Hibernate + Derby:不支持'BOOLEAN'和'INTEGER'之间的比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆