【问题标题】:MYSQL+Hibernate, Query cannot be createdMYSQL+Hibernate,无法创建查询
【发布时间】:2018-01-01 20:17:22
【问题描述】:

谁能帮我看看我的查询有什么问题?

Java 代码:

public boolean fValidLogin(String fUsername, String fPassword) {
    SessionFactory sf = new Configuration().configure().buildSessionFactory();
    Session session = sf.openSession();

    String query = "SELECT fusername,fpassword FROM flogin WHERE fusername=" + fUsername + " AND fpassword=" + fPassword + "";
    Query DBquery = session.createQuery(query);
    for (Iterator it = DBquery.iterate(); it.hasNext();) {
        it.next();
        count++;
    }
    System.out.println("Total rows: " + count);
    if (count == 1) {
        return true;
    } else {
        return false;
    }
}

MYSQL 代码:

SELECT fusername,fpassword FROM flogin WHERE fusername="SAS" AND fpassword="Sas123"

【问题讨论】:

  • 先试试这个:"SELECT fusername,fpassword FROM flogin WHERE fusername=\"" + fUsername + "\" AND fpassword=\"" +fPassword +"\""使用本机查询。也许你应该使用“createNativeQuery”而不是“createQuery”
  • 你得到什么错误?请发布完整的堆栈跟踪

标签: java mysql hibernate


【解决方案1】:

先试试这个:

"SELECT fusername,fpassword FROM flogin WHERE fusername=\"" + fUsername + "\" AND fpassword=\"" +fPassword +"\"" 

顺便说一句,您正在尝试使用本机查询。也许您应该考虑使用“createNativeQuery”而不是“createQuery”

【讨论】:

    【解决方案2】:

    您的查询是 SQL 注入的受害者,它也可能导致 语法错误,而您必须在 JPQL 查询中使用 setParameter

    String query = "SELECT f FROM flogin f WHERE f.fusername = ? AND f.fpassword = ?";
    Query dBquery = session.createQuery(query);
    dBquery.setParameter(0, fUsername);//set username variable
    dBquery.setParameter(1, fPassword);//set password variable
    

    要获得结果的 nbr,您只需致电 Query::list()

    int count = dBquery.list().size();
    

    或者只是:

    return dBquery.list().size() == 1;
    

    您查询中的真正问题是字符串应该在两个引号之间(但我不建议解决方案

    fusername='" + fUsername + "'
    //--------^_________________^
    

    注意:您的查询不是 JPQL 查询,它似乎是本机查询,如果您必须使用 session.createNativeQuery(query);

    【讨论】:

    • 感谢 YCF_L,但是当我尝试使用您的代码时,出现此错误: StandardWrapperValve[forwardServlet]: Servlet.service() for servlet forwardServlet throw exception org.hibernate.hql.internal.ast.QuerySyntaxException : flogin 未映射 [SELECT fusername, fpassword FROM flogin WHERE fusername=:fUsername AND fpassword=:fPassword]
    • @Kkr0319 再次阅读答案,我想你尝试了我的第一个版本;)
    猜你喜欢
    • 2017-10-23
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多