web-dev-qa-db-ja.com

SQLGrammarException:クエリを実行できませんでした

文字列testでデータを検索するとStruts2とHibernateを使用してエラーが発生しますが、数値111で検索するとうまくいきます。私はBeanクラスとBeanクラスの文字列型の定義されたプロパティからこの値を取得しています。

以下はコードを提供しています:

public String retrieveRecords() 
{    
    String empId = p.getEmpId();
    String paramValue = "";
    if(empId !=null)
        if(!(empId.isEmpty()))
        paramValue =" where b.empId="+empId;

    String empName = p.getEmployeeName();
    if(empName !=null && empName != "")
    {
        if(!(empName.isEmpty())){
        if(paramValue == "")
         paramValue =" where b.employeeName="+empName;
        else
         paramValue =paramValue + " and b.employeeName="+empName;
        }
    }
    System.out.println("=========paramvalues===="+paramValue);
    recList = (List<RequestBean>) session.createQuery("from RequestBean b"+paramValue).list();
    request.setAttribute("rec", recList);
    System.out.println("got size"+recList);
    return SUCCESS;
}

Beanクラス:

public class RequestBean {

    private Long id;
    private String empId;
    private String employeeName;
    private String employeeType;
    private String personnalNumber;
    private String contactNumber;
    private String companyName;
    private String address;
    private String remarks;
    private String empStatus = "E";
    private Date joiningDate = null;
    private Date created;

    /************* Getters ************************/

    public Long getId() {
        return id;
    }

    public String getEmpId() {
        return empId;
    }

    public String getEmployeeName() {
        return employeeName;
    }

    public String getEmployeeType() {
        return employeeType;
    }

    public String getPersonnalNumber() {
        return personnalNumber;
    }

    public String getContactNumber() {
        return contactNumber;
    }

    public String getCompanyName() {
        return companyName;
    }

    public String getAddress() {
        return address;
    }

    public String getRemarks() {
        return remarks;
    }

    public Date getJoiningDate() {
        return joiningDate;
    }

    public String getEmpStatus() {
        return empStatus;
    }

    public Date getCreated() {
        return created;
    }

   /******************* Setters ***************************/

    public void setId(Long id) {
        this.id = id;
    }
    public void setEmpId(String empId) {
        this.empId = empId;
    }
    public void setEmployeeName(String employeeName) {
        this.employeeName = employeeName;
    }
    public void setEmployeeType(String employeeType) {
        this.employeeType = employeeType;
    }
    public void setPersonnalNumber(String personnalNumber) {
        this.personnalNumber = personnalNumber;
    }
    public void setContactNumber(String contactNumber) {
        this.contactNumber = contactNumber;
    }
    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }
    public void setJoiningDate(Date joiningDate) {
        this.joiningDate = joiningDate;
    }
    public void setEmpStatus(String empStatus) {
        this.empStatus = empStatus;
    }
    public void setCreated(Date created) {
        this.created = created;
    }

}

マッピング:

<hibernate-mapping>
<class name="com.ims.bean.RequestBean" table="EMPDETAILS">

<id name="id" column="id">
   <generator class="increment"/>
</id>

<!-- <property name="id"     column="id" /> -->
<property name="empId"  column="empId"/>
<property name="employeeName"  column="empName"/>
<property name="employeeType"  column="empType"/>
<property name="personnalNumber"  column="personnalNum"/>
<property name="contactNumber"  column="contactNo"/>
<property name="companyName"  column="empCompanyName"/>
<property name="address"  column="address"/>
<property name="remarks"  column="remarks"/>
<property name="joiningDate"  column="joiningDate"/>
<property name="empStatus"  column="empStatus"/>
<property name="created"  column="created"/>

</class>
</hibernate-mapping>

エラー:

org.hibernate.exception.SQLGrammarException: could not execute query
    org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.Java:90)
    org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.Java:66)
    org.hibernate.loader.Loader.doList(Loader.Java:2231)
    org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.Java:2125)
    org.hibernate.loader.Loader.list(Loader.Java:2120)
    org.hibernate.loader.hql.QueryLoader.list(QueryLoader.Java:401)
    org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.Java:361)
    org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.Java:196)
    org.hibernate.impl.SessionImpl.list(SessionImpl.Java:1148)
    org.hibernate.impl.QueryImpl.list(QueryImpl.Java:102)
    com.ims.DAO.RequestControllerDAO.retrieveRecords(RequestControllerDAO.Java:60)
    Sun.reflect.GeneratedMethodAccessor76.invoke(Unknown Source)
    Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    Java.lang.reflect.Method.invoke(Unknown Source)
    ognl.OgnlRuntime.invokeMethod(OgnlRuntime.Java:891)
    ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.Java:1293)
    ognl.ObjectMethodAccessor.callMethod(ObjectMethodAccessor.Java:68)
    com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethodWithDebugInfo(XWorkMethodAccessor.Java:117)
    com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethod(XWorkMethodAccessor.Java:108)
    ognl.OgnlRuntime.callMethod(OgnlRuntime.Java:1369)
    ognl.ASTMethod.getValueBody(ASTMethod.Java:90)
    ognl.SimpleNode.evaluateGetValueBody(SimpleNode.Java:212)
    ognl.SimpleNode.getValue(SimpleNode.Java:258)
    ognl.Ognl.getValue(Ognl.Java:494)
    ognl.Ognl.getValue(Ognl.Java:458)
5
Ravi Kukreja

SQLGrammarExceptionがスローされるのは、Hibernateによって生成されたSQLクエリに誤ったSQL構文があるためです。クエリの作成方法が間違っています。結果のクエリに値(特に文字列値)を連結しないでください。そのようなコードは、可能性のある SQLインジェクション 攻撃に対して脆弱であるためです。代わりに、クエリ文字列でパラメータを使用できます

String empId = p.getEmpId();
String paramValue = "";
if (empId !=null && !empId.isEmpty())
    paramValue = " where b.empId=:empId";
String empName = p.getEmployeeName();
if (empName !=null && !empName.isEmpty()) {
    if (paramValue == "")
     paramValue =" where b.employeeName=:empName";
    else
     paramValue =paramValue + " and b.employeeName=:empName"; 
}       
System.out.println("=========paramvalues===="+paramValue);
Query query = session.createQuery("from RequestBean b"+paramValue);
//now set parameter values
if(empId !=null && !empId.isEmpty())
  query.setParameter("empId", empId);
if(empName !=null && !empName.isEmpty())
  query.setParameter("empName", empName);
recList = (List<RequestBean>) query.list();
6
Roman C

HQLからSQLに変換されたクエリが生成しています:

    "where employeeName=Name" 

それが生成されているはずですが:

    "where employeeName='Name'".

したがって、あなたのhqlは次のようになります:

    "where b.employeeName= ' " +empName+ " ' "; 

注:整数値の場合はこれを行う必要はありません。文字列変数にのみ適用されます。

1
Ankit Negi