2017-03-13 5 views
1

誰かがこのHQLクエリを手伝ってくれることを願っています。HQL(hibernate sql)の1つのlike演算子を使用して複数の列を検索する方法

私が使用している:

SQLがある
Query query = session.createQuery(sql); 

select distinct c.id from EstateConsumer as c where c.clientId = ? and (c.vehicleReg1 or c.vehicleReg2) like ? 

が、次の例外を取得している:

org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: or near line 1, column 121 

はそれでは、どのように「ORを使用することができますが""好きな "を使って構文を使う?

select distinct c.id from EstateConsumer as c where c.clientId = ? and c.vehicleReg1 like ? or c.vehicleReg2 like ? 

が、私は

+0

なぜ働くバージョン?私はそれが欠点を除いて問題を解決すると思う。 – mm759

+0

どのdbmsを使用していますか?これは、プログラムがコード化され、構造化される方法のために、dbm –

+0

@ mm759に依存します.2つのパラメータ(clientId用と複数のvehicleReg列用)を渡します。 – user2319262

答えて

3

あなたが例えばそうREGEXであなたの問題を解決することができ、複数の「のような」さんを使用したくない:

しかし作品次

REGEXP_LIKE('Hello world', 'Hello', 'mars') = 1 

クエリを置き換えることができます:

ここでは、このクエリを使用して、210

:あなたの値?が他のマッチングc.vehicleReg1またはc.vehicleReg2リターン1のようなものである場合

SELECT ... WHERE c.clientId = ? and REGEXP_LIKE(?, c.vehicleReg1, c.vehicleReg2) = 1 
-- -------------------------------------^^ 

は、これは間違った


注意があることを意味

@ mm759プログラムをコード化し、構造化された...それ のみを通過させる2つのパラメータ(複数 vehicleReg列のためのclientIdのために1つずつ)

あなたはこのようなあなたのクエリで複数の位置で同じパラメータを使用することができます。

q = getEntityManager().createNamedQuery(
"select ... where c.clientId = :par1 and c.vehicleReg1 like :par2 or c.vehicleReg2 like :par2"); 
//-------------------------------^^----------------------------^^--------------------------^^ 

q.setParamettre("par1", "value1"); 
q.setParamettre("par2", "value2"); 
+0

あなたの提案にはありがとう!その正規表現はうまくいき、私が持っていたcreateQuery例外を乗り越えました。簡単な質問ですが、REGEXP_LIKEはパラメータの前後を%記号で置換していますか?私はすでに私の "?"記号に%記号を渡しているので、これを求めています。パラメータ。 – user2319262

+0

@ user2319262はいこれは最初と最後の%を置き換えます。ここでは、どのようにREGEX_LIKEを使用できるかを理解できるリンクがあります。http://www.sqlsnippets.com/en/topic-11741.html、 'select target ターゲットから ターゲットLIKE '%bc%'; 'はターゲットから ターゲットに置き換えられます REGEXP_LIKE(ターゲット、' bc '); 'これがあなたを助けることを願って –

+0

素晴らしい、ありがとう! – user2319262

1

DBMSが「馴染み」演算子を使用して一つにトラブル同程度に、そのようなクエリの最適化を持っているという理由だけであればそう@YCF_Lによって提案されたようなREGEXP_LIKE変異体などの複雑な変異体は、追加のパフォーマンス・オーバーヘッドを含みます。

パラメータを再利用するソリューションを探しています。

あなたの状態、ためのプログラムを符号化し、構造化されている方法の

...それが唯一の2つのパラメータ(のclientIdのための1と複数のvehicleReg列の1)

Iを渡しますなぜあなたはパラメータの1つをキャプチャして再利用できないのか理解できません。YCL_Fはアップデートの中で非常に素晴らしい例ですが、JPAを使用している限り、JPAの完全な解決策にはいかがですか?これは、タイプセーフであり、リファクタルセーフであり、ネイティブSQLクエリよりも(より良い)キャッシュされるという利点があります。

例えば、

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); 
CriteriaQuery<C> jpaquery = cb.createQuery(C.class); 
Root<C> root = jpaquery.from(C.class); 

jpaquery.where(cb.and(cb.equal(root.get(C_.clientId), parameter1),cb.or(cb.like(root.get(C_.vehicleReg1), parameter2), cb.like(root.get(C_.vehicleReg2), parameter2))); 
jpaQuery.select(...); 

return getEntityManager().createQuery(jpaQuery).getResultList(); 
+0

ありがとう@ブーマン私はそれに感謝:) –

関連する問題