1

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

    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
        }

    }
4

2 に答える 2

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
}
于 2012-04-18T00:21:29.663 に答える
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();
于 2012-04-17T23:56:31.770 に答える