2011-10-23 7 views
0

私はDAOでクエリをN回実行するループを持っています。私の場合、値が「123456789」のプロパティを持つオブジェクトがあります。最初のターンでは、特定のテーブルに対するクエリを実行して、C1という列を持つすべてのレコードを取得し、 "123456789"に等しくします。SQLの最長プレフィックス文字列

2番目のターンでは、この同じテーブルのクエリを実行して、列がC1で "12345678"に等しいすべてのレコードを取得します。最長のプレフィックスを持つレコードが見つかるまで続きます。

私は、このクエリを複数回実行するのではなく、パラメータとして文字列 "123456789"をとり、 "123456789"の最長接頭語である列C1を持つレコードを返します"しかし、私はHibernate(可能であれば)を使ってそれを行う方法、または別の解決方法があるかどうかわかりません。私はMySQLを使用しています。

(私はこのpost見てきたが、私は休止状態であることを行う方法があるかどうかを知りたいと思いました。)

答えて

2

あなたが好きなSQLを実行することができます:あなたは基本的に

select * from table where 1234567 like concat(c1,'%') order by c1 desc limit 1; 

ます指定されたパラメータに一致するSQLから返される最長の値をとります。あなたが望むなら、代わりにsetMaxResultsを使うことができます。次のような列を連結します。

... 
Query query = session.createQuery("from Prefixes where :parameter like Prefixes.prefix || '%' order by Prefixes.prefix desc"); 
query.setParameter("parameter", 1234567); 
query.setMaxResults(1); 
Prefixes p = (Prefixes)query.uniqueResult(); 
... 
+0

答えをいただきありがとうございます。しかし、私は二つの質問があります:まず、concat()と||の使用の違いは何ですか?また、このHQL文は、異なるDBMS間で移植可能ですか? –

+0

私が知る限り、||これは、それぞれのデータベースに独自の機能で変換されることを意味します。 concatは通過し、特定のデータベースで動作します。 –

関連する問題