4

Derbyデータベースのクエリに問題があります。JPAでHibernateを使用しています。問題は(おそらく)ブール列に関連しています。各クエリはエラーで終了します:

org.hibernate.exception.SQLGrammarException:「BOOLEAN」と「INTEGER」の比較はサポートされていません。タイプは比較可能でなければなりません。文字列タイプにも一致する照合が必要です。照合が一致しない場合、考えられる解決策は、オペランドをキャストしてデフォルトの照合に強制することです(たとえば、SELECT tablename FROM sys.systables WHERE CAST(tablename AS VARCHAR(128))='T1')

以下にサンプルコードと構成を示します。サンプルは読みやすくするために簡略化されています。これが私のJPAエンティティです。

@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 + " ]";
    }
}

私のJPAクエリ:

SELECT t FROM Task t WHERE deleted = false

私のJPA構成:

<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>

なにが問題ですか?それを修正する方法は?提案をありがとう。

4

4 に答える 4

4

ブールデータ型はDerby10.7で追加されました。10.7以降を使用しているように見えるため、org.hibernate.dialect.DerbyTenSevenDialectブールサポートを追加する方言を使用する必要があります。

于 2012-04-11T22:18:06.160 に答える
3

ブール値をパラメータとして設定する必要があります。

String queryString = "SELECT t FROM Task t WHERE t.deleted = :trueValue";
Query query = entityManager.createQuery(queryString);
query.setParameter("trueValue", true);
query.getResultList();

それがあなたのために働くことを願っています;)

于 2012-05-23T08:24:42.100 に答える
2

ダウングレードは役に立ちませんでした。これが私のために働く有効な解決策です:

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");
    }
}

方言でDerbyデータ型にマッピングする「true」および「false」定数を構成する方が良いと思いますが、今のところ上記で十分です。

于 2012-04-21T21:52:51.483 に答える
1

Rafalのアプローチを使用しましたが、追加する必要もあります

@Override
public String toBooleanValueString(boolean bool) {
    return bool ? "1" : "0";
}

私の方言で。それ以外の場合、Hibernate4.2.8では機能しません。

また、アプリがOracleとDerbyに対して実行されているため、persistence.xmlで方言を明示的に指定できませんでした。そこで、方言に方言リゾルバーを追加しました。

<property name="hibernate.dialect_resolvers" value="...DerbyBoolAsIntDialectResolver"/>

リゾルバー自体:

public class DerbyBoolAsIntDialectResolver extends AbstractDialectResolver {
    @Override
    protected Dialect resolveDialectInternal(DatabaseMetaData metaData) throws SQLException {
        String databaseName = metaData.getDatabaseProductName();
        int databaseMajorVersion = metaData.getDatabaseMajorVersion();

        if ( "Apache Derby".equals( databaseName ) ) {
            final int databaseMinorVersion = metaData.getDatabaseMinorVersion();
            if ( databaseMajorVersion > 10 || ( databaseMajorVersion == 10 && databaseMinorVersion >= 7 ) ) {
                return new DerbyBoolAsIntDialect();
            }
        }
        return null;
    }
}
于 2013-12-14T12:55:49.067 に答える