2012-04-17 9 views
1

認証時にユーザーのクエリに関するフィードバックを探しています。最初の考えは、以下のコードを書いたときに、データベース内のすべてのユーザー名を照会し、提供されたユーザー名がユーザーのリストに属するかどうかを確認することによってユーザー名を取得することでした。このタイプの検査は、usersテーブルが大きくなるとパフォーマンス上の問題になりますか?JPAユーザーを照会するときの潜在的なパフォーマンスの問題

EntityManager entityManager = factory.createEntityManager(); 
    /*Create a data structure to hold a list of users in our database*/ 
    List<String> allUsernames = new ArrayList<String>(); 

    allUsernames = entityManager.createQuery("SELECT user.username FROM Users user").getResultList(); 

    /*Loop through each user in our available usernames checking if the username passed exists*/ 
    for (String user : allUsernames) { 

     if (user.equals(username)) { 
      System.out.println("Found real user\n"); 
      userFoundFLAG = 1; // set the flag equal to 1 when this user is found 
     } 

    } 

答えて

0

名前でユーザーを検索してみませんか?非ゼロのリストが返された場合、ユーザは存在し、そうでない場合は存在します。さらに、認証/認可ロジックを追加するために必要となるため、ユーザーオブジェクト全体を読み取るのはなぜですか?

final TypedQuery<String> query = entityManager 
     .createQuery("SELECT u.username FROM Users u WHERE u.username = :username", String.class); 
query.setParameter("username", "BillyBob"); 
if (query.getResultList().size() > 0) { 
    // ... 
} 

または:

final TypedQuery<User> query = entityManager 
     .createQuery("SELECT u FROM Users u WHERE u.username = :username"); 
query.setParameter("username", "BillyBob"); 
final User user = query.getFirstResult(); 
+0

は、それが失敗します。クエリがヌルオブジェクトを返すまで終了します – Warz

+0

最初の提案は、クエリを再実行するときにTypedQuery型のキャストが必要です – Warz

+0

どのメソッドを使用していますか? 2番目の場合、EntityNotFoundExceptionを処理する準備が必要です(データベースに対応するレコードがない場合に発生します)。 – Perception

1

はい、これはユーザー数の増加に伴って問題のよりに成長し、パフォーマンスの問題だろう。間違いなくそれをしないでください。あなたが何かやるべき

:ユーザ名が存在しない場合、私は、パラメータとしてユーザ名を渡すユーザオブジェクトを照会するには、この方法を変更する場合

try { 
    User user = (User)entityManager.createQuery("SELECT user FROM Users user where user.username = :username") 
     .setParameter ("username", username); 
     .getSingleResult(); 
    userFoundFLAG = 1; 
} catch (NoResultException e) { 
    //There is no user with this username - do something 
} catch (NonUniqueResultException e) { 
    //There is more than one user with this username - do something 
} 
+0

パーフェクト・ダモ、ここであなたのコードを試してみました。私はしかし、それが失敗したとしてあなたのキャッチする例外を変更する必要がありました。 Springフレームワークを使用している場合は、EmptyResultDataAccessExceptionもキャッチする必要があります – Warz

関連する問題