2016-11-24 13 views
1

データベース上でクエリを実行して、電話番号の範囲が重複しているかどうかを確認しています。HQLとMySqlデータベースでTRIM LEADING関数を使用する

いくつかの数字は前に「+」文字を持つものとして保存されます:332457896および他のは、それなしで保存されています。332457897.

のでcomparaisonを行う前に、私は潜在的なリーディング・「+」を削除します。

私はネイティブのクエリを使用してMySQL Workbenchで、あるいは休止状態で正常に動作しますMySQLのトリム機能が見つかりました:

TRIM(LEADING '+' FROM MyColumn) 

をしかし、私はHQLクエリーを休止状態使用して同じことをしようとすると、私はエラーを取得する:

org.hibernate.hql.internal.ast.ErrorCounter - 参加予定のパス!

私は「From」キーワードと関連があると推測しています。

は、私がチェックされ、トリム機能は、EJB-QL 3.0でサポートされており、その構文は次のとおりです。

トリム([有数|末尾|両方]文字列[から])

編集:ここにこのクエリを実行するために使用したJavaコードです

startNumberとendNumberは、作成しようとしている範囲の完全な電話番号です。 そして、私は、既存のrangeStartとrangeEndをconcataining接頭辞とrangeStart/rangeEnd列で作成するRangeテーブルと照合します。

public List<Range> findRangeOverlap(String pStartNumber, String pEndNumber) { 
    StringBuilder jpaQuerySb = new StringBuilder("SELECT p FROM MyTable p "); 

    // Overlap restriction 
    // For readability extract the string to build the start and end number for all the other range 
    String otherStart = "TRIM(LEADING '+' FROM CONCAT(IFNULL(p.prefix, ''), IFNULL(p.rangeStart, ''))) "; 
    String otherEnd = "TRIM(LEADING '+' FROM CONCAT(IFNULL(p.prefix, ''), IFNULL(p.rangeEnd, ''))) "; 

    // Then check for overlap 
    jpaQuerySb.append("where ((:start >= ").append(otherStart); 
    jpaQuerySb.append("and :start <= ").append(otherEnd).append(")"); 
    jpaQuerySb.append("or (:end >= ").append(otherStart); 
    jpaQuerySb.append("and :end <= ").append(otherEnd).append("))"); 

    Query q = entityManager().createQuery(jpaQuerySb.toString()); 
    q.setParameter("start", pStartNumber); 
    q.setParameter("end", pEndNumber); 

    return q.getResultList(); 
} 
+0

これはあなたに役立ちますか:http://stackoverflow.com/questions/8355719/calling-a-mysql-function-returning-varchar-in-hibernate? – actc

+0

こんにちは、ありがとう、しかし、これは私がそれをやっている方法は、concatはうまくそれはブロック、私は思う1つのパラメータを持っているだけTRIM機能に必要なFROMキーワードです。 – TheBakker

+0

一般的に+については何も追加しませんか? – actc

答えて

1

あなたは

return entityManager().createNativeQuery(jpaQuerySb.toString(), Range.class).getResultList(); 

を試してみましたか?

ネイティブクエリを作成する場合は、エンティティマネージャの適切なメソッドを使用する必要があります。

+0

申し訳ありませんが私のコピーされたコードで間違って、私はparamsでインスタンス化されたクエリを使用していない代わりにStringBuilderから再構築していた。 メインポストのコードを修正しました – TheBakker

+0

MySQL Workbenchと同じように、HQLの代わりにSQLになるように文字列クエリを変更した場合、nativeQueryで正常に動作します。 私の質問は、HQLで動作させる方法です。 – TheBakker

関連する問題