2016-10-02 30 views
0

我學習了hibernate框架,我對生成的sql很困惑。 我有以下代碼:不正確的Hibernate HQL/DAO函數/編寫Spring Security時 - 註解

表:

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; 
} 

}

而現在......道功能(兩種型號):

第一個:

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_ 

的第二個變體是相當正確的,從數據庫中獲取用戶。但在第一種情況下,存在空指針異常而不是User對象。什麼是不正確的? 值得高興的是,生成的sql在MySql Workbench中很好(第一種情況)。

+0

我的答案適合您嗎? –

+0

我暫時有項目的其他問題:(。但是當我解決它時,我會回到它並給出反饋。謝謝你的回答。 – Maxim

回答

0

第一個變體嘗試使用給定的登錄名獲取用戶,但沒有找到用戶登錄名(驗證數據庫中是否存在具有給定登錄名的用戶)。
第二個變體列出數據庫中的所有用戶並獲取第一個變體。你的用戶表包含一些用戶,這就是爲什麼這個變體返回一個用戶而不是空的。

相關問題