当前位置: 代码迷 >> Java Web开发 >> SSH查询出错,service无法调用到dao~
  详细解决方案

SSH查询出错,service无法调用到dao~

热度:75   发布时间:2016-04-16 22:24:21.0
SSH查询报错,service无法调用到dao~!

初建了个ssh框架,练习CRUD,save方法可以执行,但是增加查询方法就报错~!

beans.xml

 <bean id="userAction" class="com.yuwei.action.UserAction" scope="prototype">
     <property name="userService" ref="userService"/>
    </bean>
    
<bean id="userService" class="com.yuwei.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>

<bean id="userDao" class="com.yuwei.dao.impl.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>



UserAction.java


public String user_query(){

String username = user.getUsername();
queryUserList = userService.findUserByName(username);

return SUCCESS;
}


UserServiceImpl.java

public List<User> findUserByName(String username) {

List<User> list = userDao.findUserByName(username);

return list;
}



UserDaoImpl.java

public List<User> findUserByName(String username) {

String sql = "select * from User where username = " + username;

List<User> list = getHibernateTemplate().find(sql);

return list;
}




我用debug方式跟踪的时候,比如页面传入一个username的值"ss",在UserAction里面可以取到,跟进UserService里面之后继续执行就直接进入class文件JdkDynamicAopProxy.class 的public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 方法了,而没有进入UserDao的方法~!


页面报错:
java.lang.reflect.InvocationTargetException
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:450)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:289)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:252)
org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
。。。。。。。。。。。

root cause 

java.lang.NoSuchMethodError: org.hibernate.hql.antlr.HqlBaseParser.recover(Lantlr/RecognitionException;Lantlr/collections/impl/BitSet;)V
org.hibernate.hql.antlr.HqlBaseParser.selectClause(HqlBaseParser.java:1391)
org.hibernate.hql.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1106)
org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:702)
org.hibernate.hql.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:296)
org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:159)
org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:248)
org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:157)
org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)

。。。。。。。

求解

------解决方案--------------------
你为什么要拼SQL呢,很容易出错还会SQL注入。
建议用:getHibernateTemplate().find(String queryString, Object...values)
动态传参赋值,简单方便又安全。
------解决方案--------------------
find(String queryString , Object value);
------解决方案--------------------
既然整合就用hibernate用上就可以了、这样不容易出错、
  相关解决方案