2012-11-22 38 views
0

我使用Hibernate作爲持久層,這裏是我的代碼示例,但在這裏我的HQL查詢:MYSQL SQL語法錯誤冬眠

Query q = s.createQuery("from Login where name=:user and passw =:passw"); 
    q.setParameter("user",username); 
    q.setParameter("passw", passw); 
Query q = s.createSQLQuery("SELECT * from Good where Good.supplier =:supl AND Good.name =:gname AND Good.dates >=:sdate and Good.dates <=:fdate").addEntity(Good.class); 
    q.setParameter("supl",sup); 
    q.setParameter("gname", gname); 
    q.setParameter("sdate", sdate); 
    q.setParameter("fdate",fdate); 

SDATE和FDATE parametrs是字符串,他們是好的在這種情況下?它拋出此異常:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.login login0_ where login0_.name='Tom'' at line 1 

Login.hbm.xml

<hibernate-mapping> 
<class name="kz.bimash.FoodSec.model.Login" table="login" catalog="foodsec"> 
    <id name="id" type="java.lang.Integer"> 
     <column name="Id" /> 
     <generator class="increment" /> 
    </id> 
    <property name="name" type="string"> 
     <column name="name" length="50" not-null="true" unique="true" /> 
    </property> 
    <property name="passw" type="string"> 
     <column name="passw" length="50" not-null="true" /> 
    </property> 
    <property name="type" type="string"> 
     <column name="type" length="45" not-null="true" /> 
    </property> 
    <property name="userId" type="int"> 
     <column name="userId" not-null="true" /> 
    </property> 
</class> 

登錄POJO類

public class Login implements java.io.Serializable { 


private Integer id; 
private String name; 
private String passw; 
private String type; 
private int userId; 

public Login() { 
} 

public Login(String username, String password, String type, int userId) { 
    this.name = username; 
    this.passw = password; 
    this.type = type; 
    this.userId = userId; 
} 

public Integer getId() { 
    return this.id; 
} 

public void setId(Integer id) { 
    this.id = id; 
} 
public String getName() { 
    return this.name; 
} 

public void setName(String username) { 
    this.name = username; 
} 
public String getPassw() { 
    return this.passw; 
} 

public void setPassw(String password) { 
    this.passw = password; 
} 
public String getType() { 
    return this.type; 
} 

public void setType(String type) { 
    this.type = type; 
} 
public int getUserId() { 
    return this.userId; 
} 

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

} 登錄DAO類

@Repository 
public class LoginDAO { 
@Autowired 
private SessionFactory sf; 
@SuppressWarnings("empty-statement") 
public String[] Authorise(String username, String passw){ 
    Session s = sf.getCurrentSession(); 
    s.beginTransaction(); 
    Query q = s.createQuery("from Login where name=:user and passw =:passw"); 
    q.setParameter("user",username); 
    q.setParameter("passw", passw); 
    q.setMaxResults(1); 
    String[] str = null; 
    Login login = null; 
    for(Iterator it = q.iterate(); it.hasNext();){ 
    login = (Login)it.next(); 

    } 
    if(login != null){ 
     str = new String[]{login.getType(), String.valueOf(login.getUserId())}; 

    } 
     s.getTransaction().commit(); 
    return str; 
} 
public boolean checkLogin(String username){ 
    Session s = sf.getCurrentSession(); 
    s.beginTransaction(); 
    // String s_sql ="SELECT * FROM Login WHERE NAME="+username; 
    Query q = s.createQuery("from Login where name = :usern"); 
    q.setParameter("usern", username); 
    // Query q=s.createSQLQuery(s_sql); 
    List<Login> logins =null; 
    logins= (List<Login>)q.list(); 
    s.getTransaction().commit(); 
    if(logins !=null) 
     return true; 
    else 
     return false; 
} 

}

+0

你可以發佈你的類'登錄'和映射文件(後者只有當你使用xml映射文件)? – Johanna

+0

感謝您的回覆,我已經更新了問題 – Olzhas

+0

我在這裏看到的代碼沒有錯,因爲我已經用PostgreSql測試它工作正常。那麼如何解決這個問題呢?我不知道 – Olzhas

回答

1

有一個與代碼的以下部分問題:

Query q = s.createSQLQuery("SELECT * from Good where Good.supplier =:supl AND Good.name =:gname AND Good.dates >=:sdate and Good.dates <=:fdate").addEntity(Good.class); 

你正在編寫一個SQL &不是HQL的。這就是爲什麼你使用session.createSQLQuery(...)而不是session.createQuery(...)createSQLQuery(...)總是返回org.hibernate.SQLQuery的引用,而您已將其分配給變量Query

我很驚訝爲什麼沒有編譯時錯誤。

嘗試將其分配給SQLQuery變量&檢查它是否正常工作。

+0

這部分代碼我還沒有實現,你能給我一個建議我怎麼才能比較日期部分通過使用HQL或SQL? – Olzhas

+0

我正在使用PostgreSql,除了你已經注意到的代碼片段之外的其他查詢,與postgresql一起正常工作,但它在mysql中顯示了上述錯誤,你可以建議嗎? – Olzhas

+0

這部分代碼僅由您實施。我已經複製了帖子中的內容。 – RAS