2016-10-02 3 views
0

私はHibernateフレームワークを学びました。私は生成されたSQLと混同しています。HibernateのHQL/DAO関数/ Springセキュリティのコーディング中に間違っています - 注釈

表:

CREATE TABLE users (
user_id int NOT NULL AUTO_INCREMENT, 
login varchar(20) UNIQUE, 
pass varchar(20), 
user_name varchar(20), 
surname varchar(20), 
PRIMARY KEY (user_id) 
) 

モデル:

@Entity 
@Table(name="users", catalog="maximodb") 
public class User implements Serializable{ 

@Id 
@Column(name="user_id") 
@GeneratedValue(strategy =GenerationType.IDENTITY) 
private Integer userId; 

@Column(name = "login", unique = true, length = 20) 
private String login; 

@Column(name = "pass", length = 20) 
private String pass; 

@Column(name = "user_name", length = 20) 
private String userName; 

@Column(name = "surname", length = 20) 
private String surname; 


@ManyToMany(fetch = FetchType.LAZY) 
@JoinTable(name = "users_roles", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") }) 
private Set<Role> userRoles = new HashSet<Role>(); 

public User() { 
} 

public User(String login, String pass, String userName, String surname) { 
    this.login = login; 
    this.pass = pass; 
    this.userName = userName; 
    this.surname = surname; 
} 


public Integer getUserId() { 
    return this.userId; 
} 

public void setUserId(Integer userId) { 
    this.userId = userId; 
} 

public String getLogin() { 
    return this.login; 
} 

public void setLogin(String login) { 
    this.login = login; 
} 

public String getPass() { 
    return this.pass; 
} 

public void setPass(String pass) { 
    this.pass = pass; 
} 

public String getUserName() { 
    return this.userName; 
} 

public void setUserName(String userName) { 
    this.userName = userName; 
} 

public String getSurname() { 
    return this.surname; 
} 

public void setSurname(String surname) { 
    this.surname = surname; 
} 

public Set<Role> getUserRoles() { 
    return userRoles; 
} 

public void setUserRoles(Set<Role> userRoles) { 
    this.userRoles = userRoles; 
} 

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((login == null) ? 0 : login.hashCode()); 
    result = prime * result + ((pass == null) ? 0 : pass.hashCode()); 
    result = prime * result + ((surname == null) ? 0 : surname.hashCode()); 
    result = prime * result + ((userId == null) ? 0 : userId.hashCode()); 
    result = prime * result + ((userName == null) ? 0 : userName.hashCode()); 
    result = prime * result + ((userRoles == null) ? 0 : userRoles.hashCode()); 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    User other = (User) obj; 
    if (login == null) { 
     if (other.login != null) 
      return false; 
    } else if (!login.equals(other.login)) 
     return false; 
    if (pass == null) { 
     if (other.pass != null) 
      return false; 
    } else if (!pass.equals(other.pass)) 
     return false; 
    if (surname == null) { 
     if (other.surname != null) 
      return false; 
    } else if (!surname.equals(other.surname)) 
     return false; 
    if (userId == null) { 
     if (other.userId != null) 
      return false; 
    } else if (!userId.equals(other.userId)) 
     return false; 
    if (userName == null) { 
     if (other.userName != null) 
      return false; 
    } else if (!userName.equals(other.userName)) 
     return false; 
    if (userRoles == null) { 
     if (other.userRoles != null) 
      return false; 
    } else if (!userRoles.equals(other.userRoles)) 
     return false; 
    return true; 
} 

}

そして今... DAO機能(2つのバリエーション):

私は、次のコードを持っています最初のもの:

List<User> users = new ArrayList<User>(); 

    users = sessionFactory.getCurrentSession() 
     .createQuery("from User where login= :login") 
     .setString("login", login) 
     .list(); 

    if (users.size() > 0) { 
     return users.get(0); 
    } else { 
     return null; 
    } 

返されるSQL:

select 
    user0_.user_id as user_id1_1_, 
    user0_.login as login2_1_, 
    user0_.pass as pass3_1_, 
    user0_.surname as surname4_1_, 
    user0_.user_name as user_nam5_1_ 
from 
    maximodb.users user0_ 
where 
    user0_.login=? 

そして、第二の変形例:

Criteria criteria = sessionFactory.getCurrentSession().createCriteria(User.class); 
    List<User> a = (List<User>) criteria.list(); 

User us = a.get(0); 


    return us; 

返されるSQL:

select 
    this_.user_id as user_id1_1_0_, 
    this_.login as login2_1_0_, 
    this_.pass as pass3_1_0_, 
    this_.surname as surname4_1_0_, 
    this_.user_name as user_nam5_1_0_ 
from 
    maximodb.users this_ 

第二の変形は非常に正確であるとDBからユーザーを取得します。しかし、最初のケースでは、Userオブジェクトの代わりにnullポインタ例外があります。何が間違っていますか? 生成されたsqlがMySql Workbench(最初のケース)でうまく動作することは重要です。

+0

私の答えはあなたのために働いていますか? –

+0

私は一時的にプロジェクトに別の問題を抱えています。(しかし、私はそれを解決するときに私はそれに戻り、フィードバックを与えます。 – Maxim

答えて

0

最初の変種は、指定されたログインでユーザーを取得しようとしましたが、このログインでユーザーが見つかりませんでした(データベースに特定のログインを持つユーザーがいることを確認してください)。
2番目の変種は、データベース内のすべてのユーザーをリストし、最初のものを取得します。 Userテーブルには、このバリアントがnullを返さないユーザーを返す理由のユーザーが含まれています。

関連する問題