データベース上でクエリを実行して、電話番号の範囲が重複しているかどうかを確認しています。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();
}
これはあなたに役立ちますか:http://stackoverflow.com/questions/8355719/calling-a-mysql-function-returning-varchar-in-hibernate? – actc
こんにちは、ありがとう、しかし、これは私がそれをやっている方法は、concatはうまくそれはブロック、私は思う1つのパラメータを持っているだけTRIM機能に必要なFROMキーワードです。 – TheBakker
一般的に+については何も追加しませんか? – actc