私が@Entity
好きだと言う
class C {
List<String> sequence;
}
そしてC
、与えられたリストに完全に一致するインスタンスを照会したいと思います。(これは順序に依存することを認識しており、問題ありません。)EclipseLinkを使用し、JPQLでクエリを実行しています。
私は明白なことを試みました:
List<String> querySeq = ... // some list to be used in the where clause
em.createQuery("select c from C c where c.sequence = :qs", C.class)
.setParameter("qs", querySeq);
を使用してクエリを実行しようとすると、これは失敗しますgetResultList()
。エラーはjava.sql.SQLSyntaxErrorException: row column count mismatch
です。
私も試してみましたjoin
:
select c from C c join c.sequence s where s in :qs
しかし、これも失敗します。これについてのThe collection-valued path 'c.sequence' must resolve to an association field.
私の解釈はjoin
、プリミティブのコレクションでは機能せず、リレーションでのみ機能するということです。
だから私の質問は:
これを行う正しい方法は何ですか?
また、(集合)共通部分、和集合、または差分のクエリなど、プリミティブコレクションに対してより複雑な操作を実行する方法はありますか?
JPQLを使用してリストを直接比較できるソリューションや記事は見つかりませんでした。ただし、値がコレクションのメンバーであるかどうかをテストできるメカニズムがあります。
プロセスは洗練されていませんが、少し調整することで、これに似たクエリを作成できます(コードをテストできませんでしたが、アイデアを表しており、論理的に機能するはずです)。
String query = "SELECT c FROM C c";
String checkValue = "";
for(int i = 0; i<queryString.size();i++){
checkValue = queryString.get(i);
if(i==queryString.size()-1){
query += " WHERE '" + checkValue + "'" + " MEMBER OF c.sequence";
}else{
query += " WHERE '" + checkValue + "'" + " MEMBER OF c.sequence AND";
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加