Hibernate + Derby:不支持'BOOLEAN'和'INTEGER'之间的比较 [英] Hibernate + Derby: Comparisons between 'BOOLEAN' and 'INTEGER' are not supported
问题描述
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屋!