0

背景:ユーザーエンティティがあります。Userエンティティは次のようになります。

private String name;
private String address;
private List<Picture> pictureList; //The users pictures
private int rolesBitmask; //Is a bitmask for around 20 different roles
private int anotherBitmask; //Is similar bitmask as the roles
//
// Maybe 20 more fields..

これらすべてのフィールドでJPQLクエリを実行するAJAX検索Webページがあります(写真ではないかもしれませんが、ほとんどのフィールドで)。

たとえば、Webユーザーは、「An%」のような名前のユーザーを検索し、「Pica%」のようなアドレスに住んでいて、「printer」、「admin」、「guest」の役割を持ち、残りは気にしない場合があります。利用可能な役割の。「printer」、「admin」、および「guest」の役割は、事前定義された値に従ってビットマスクに解釈されます。

私の最初の質問:

この種のクエリを1つのJPQL/どのクエリでも実行するのは悪い考えですか?

2番目の質問: これらの「複雑な」クエリを続行する場合、パフォーマンスはどうなりますか(ユーザーがフォームを変更するたびに新しいデータベースアクセスになる可能性があるのはAJAX Webページであることに注意してください)。

3番目の質問: SQLでは、名前、住所、および役割を持つすべてのユーザーを取得するために、次のようなことを行います。

SELECT * FROM User WHERE (rolesBitmask & queryRoleBitmask) ^ queryRoleBitmask = 0 AND name LIKE 'An%' AND address LIKE 'Pica%';

私が知っているように、JPQLはビット演算をサポートしていないため、ネイティブクエリを使用するか、JPQLに相当するものに変換する必要がありますが、どのように実行するのかわかりません。あなたは?

ここで私を案内してもらえますか、多分私はこのAJAX検索Webページのアイデア全体をスラッシュカンに投げ込む必要がありますか、それともあなたはそれについてどう思いますか?多くの基準を扱う場合のベストプラクティスは何ですか?

前もって感謝します

4

1 に答える 1

1

これには、ネイティブSQLクエリを使用できます。

JPQLはビット演算子を直接サポートしていませんが、EclipseLinkを使用している場合は、SQL演算子を使用できます。

Select u from User u where SQL('((? & ?) ^ ?)', u.rolesBitmask, u.queryRoleBitmask, u.queryRoleBitmask) = 0 and u.name LIKE 'An%' AND u.address LIKE 'Pica%'

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#SQL

于 2012-08-07T13:54:14.807 に答える