Hibernate调用SQL问题,来大虾解决一下!

宇宙最强皮皮虾 2014-10-14 03:13:03

Hibernate 调用SQL语句:

public List<Object> getObjectSQLList(String sql, Class classStr) {
Query query =super.getSession().createSQLQuery(sql).addEntity(classStr);
return query.list();
}


SQL语句里其中有一句是:

LEFT JOIN t_position_face pf ON pf.geom.STContains (
geometry :: STGeomFromText (
'POINT(' + p.gpsx + ' ' + p.gpsy + ')',
0
)
) = 1


结果现在是我这句SQL在数据库中可以执行,但是用Hibernate调用就会报错:

org.hibernate.QueryException: Not all named parameters have been set: [:STGeomFromText] [select p.* from t_project p left join t_region r on p.region_id = r.id left join t_position_face pf on pf.geom.STContains(geometry::STGeomFromText('POINT('+p.gpsx +' '+p.gpsy+')', 0)) = 1 where p.is_delete = 0 and r.is_delete = 0 and r.id = 354 and ( ( p.keywordid like '13' or p.keywordid like ',13' or p.keywordid like '13,' or p.keywordid like '13,%' or p.keywordid like '%,13,%' or p.keywordid like '%,13' ) or ( pf.id = 13 ) ) order by id desc]
at org.hibernate.impl.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:291)
at org.hibernate.impl.SQLQueryImpl.verifyParameters(SQLQueryImpl.java:201)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:145)
at com.dcsm.dao.BaseDaoImpl.getObjectSQLList(BaseDaoImpl.java:162)
at com.dcsm.dao.ProjectDao.findProject(ProjectDao.java:118)
at com.dcsm.service.impl.ProjectServiceImpl.findProject(ProjectServiceImpl.java:21)
at com.dcsm.controller.MeddiaFirstController.searchProjectList(MeddiaFirstController.java:65)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)


完整SQL为:

select * from t_project p
left join t_position_face_test ft on ft.geom.STContains(geometry::STGeomFromText('POINT('+p.gpsx +' '+p.gpsy+')', 0)) = 1
where ft.id = 7


提示geom字段类型为geometry,数据库为SQL Server:
...全文
961 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
velsen820john 2018-09-02
  • 打赏
  • 举报
回复
引用 19 楼 u011702993 的回复:
已解决:我吧createSQLQuery换成了JDBC来进行查询就没事了。

并且也不会在出现什么“:”冒号的问题。



\\:\\:就可以啦
zy_think123 2014-10-15
  • 打赏
  • 举报
回复
你应该是想要调用一个函数吧?在hibernate中正如大家说的那样你使用:就认为你想要传递参数,所以你可以看看如何调用函数
  • 打赏
  • 举报
回复
已解决:我吧createSQLQuery换成了JDBC来进行查询就没事了。 并且也不会在出现什么“:”冒号的问题。
  • 打赏
  • 举报
回复
引用 13 楼 sky_walker85 的回复:
楼主先确认一下你传递的SQL语句是否需要传递参数,如果不需要的话,直接执行就可以了。我的理解是你传进去的sql本身就不用设置参数
引用 15 楼 arkwrightzhn 的回复:
这个问题可太棘手了,关键手边也没有环境,不能试。你的SQL语句要求你要带冒号(:),而hibernate又好心办坏事把冒号加单词理解成了一个参数希望你去设置。就一定要想办法不要在sql语句里带冒号加单词的形式,还要让数据库认识。 查一下你所使用的数据库的手册,看看有没有类似char(58)可以表示冒号这样的方法,或者有没有可能用其它字符代替冒号,然后通过告诉数据库那个字符表示冒号。 呃,如果实在不行,就只能在数据库里写一个存储过程,程序中去调存储过程了。 另外,Hibernate是不是有一种方法可以把SQL语句配在配置文件里呀? 还有,那个双冒号前面的geometry表示什么?函数库?还是表示某个数据库实例呀?如果是数据库实例或schema,hibernate可以通过配置把它配到配置文件中,然后sql语句里就不用写它了。
引用 14 楼 sc6231565 的回复:
你的内置函数 调用的时候 前面要加上库的所有者 xxx.geometry
谢谢大家了,geometry是一个数据库类型,坐标类型。我刚查了资料: 要想使用hibernate的空间数据操作,就要提到一个概念 java Topology Suite (字面上理解就是 空间拓扑的意思,简称JTS, 注意:过需要声明一点,本文中的JTS与进行java事务处理的JTS、JTA没有联系) 正在看 ....
Norris_Zhang 2014-10-14
  • 打赏
  • 举报
回复
引用 15 楼 arkwrightzhn 的回复:
这个问题可太棘手了,关键手边也没有环境,不能试。你的SQL语句要求你要带冒号(:),而hibernate又好心办坏事把冒号加单词理解成了一个参数希望你去设置。就一定要想办法不要在sql语句里带冒号加单词的形式,还要让数据库认识。 查一下你所使用的数据库的手册,看看有没有类似char(58)可以表示冒号这样的方法,或者有没有可能用其它字符代替冒号,然后通过告诉数据库那个字符表示冒号。 呃,如果实在不行,就只能在数据库里写一个存储过程,程序中去调存储过程了。 另外,Hibernate是不是有一种方法可以把SQL语句配在配置文件里呀? 还有,那个双冒号前面的geometry表示什么?函数库?还是表示某个数据库实例呀?如果是数据库实例或schema,hibernate可以通过配置把它配到配置文件中,然后sql语句里就不用写它了。
实在不行,就从session里get出connection来,写JDBC吧。
Norris_Zhang 2014-10-14
  • 打赏
  • 举报
回复
这个问题可太棘手了,关键手边也没有环境,不能试。你的SQL语句要求你要带冒号(:),而hibernate又好心办坏事把冒号加单词理解成了一个参数希望你去设置。就一定要想办法不要在sql语句里带冒号加单词的形式,还要让数据库认识。 查一下你所使用的数据库的手册,看看有没有类似char(58)可以表示冒号这样的方法,或者有没有可能用其它字符代替冒号,然后通过告诉数据库那个字符表示冒号。 呃,如果实在不行,就只能在数据库里写一个存储过程,程序中去调存储过程了。 另外,Hibernate是不是有一种方法可以把SQL语句配在配置文件里呀? 还有,那个双冒号前面的geometry表示什么?函数库?还是表示某个数据库实例呀?如果是数据库实例或schema,hibernate可以通过配置把它配到配置文件中,然后sql语句里就不用写它了。
Magical茏 2014-10-14
  • 打赏
  • 举报
回复
你的内置函数 调用的时候 前面要加上库的所有者 xxx.geometry
skyWalker_ONLY 2014-10-14
  • 打赏
  • 举报
回复
楼主先确认一下你传递的SQL语句是否需要传递参数,如果不需要的话,直接执行就可以了。我的理解是你传进去的sql本身就不用设置参数
  • 打赏
  • 举报
回复
引用 10 楼 sky_walker85 的回复:
[quote=引用 8 楼 u011702993 的回复:] [quote=引用 6 楼 sc6231565 的回复:] 在hql里面 你使用 :xxxx 这种格式,Hibernate 就会认为 你是要传参进去!
貌似还真是你说的这么回事,那肿么办?[/quote] 如果你没有参数的话,使用HQL直接执行查询就可以了[/quote]
引用 9 楼 sc6231565 的回复:
[quote=引用 8 楼 u011702993 的回复:] [quote=引用 6 楼 sc6231565 的回复:] 在hql里面 你使用 :xxxx 这种格式,Hibernate 就会认为 你是要传参进去!
貌似还真是你说的这么回事,那肿么办?[/quote] 可以尝试 下 query.setParameter(":STGeomFromText",":STGeomFromText");[/quote]
引用 5 楼 EverWHL 的回复:

 [select p.* from t_project p left join t_region r on p.region_id = r.id left join t_position_face pf on pf.geom.STContains(geometry::STGeomFromText('POINT('+p.gpsx +' '+p.gpsy+')', 0)) = 1 where p.is_delete = 0 and r.is_delete = 0 and r.id = 354 and ( ( p.keywordid like '13' or p.keywordid like ',13' or p.keywordid like '13,' or p.keywordid like '13,%' or p.keywordid like '%,13,%' or p.keywordid like '%,13' ) or ( pf.id = 13 ) ) order by id desc]
试这个sql
引用 1 楼 sizhouzhou 的回复:
命名参数设置的不对,hibernate查询关联表之间的数据 是要配置一对多或者多对一的
新问题: 刚才那个确实是因为“:”的问题,我改了后出现新问题,有见过的嘛?
query.setParameter(":STGeomFromText","::STGeomFromText");
新问题: Coldplay 2014/10/14 16:42:31 com.microsoft.sqlserver.jdbc.SQLServerException: 'geometry@P0' 不是可以识别的 内置函数名称。
  • 打赏
  • 举报
回复
引用 9 楼 sc6231565 的回复:
[quote=引用 8 楼 u011702993 的回复:] [quote=引用 6 楼 sc6231565 的回复:] 在hql里面 你使用 :xxxx 这种格式,Hibernate 就会认为 你是要传参进去!
貌似还真是你说的这么回事,那肿么办?[/quote] 可以尝试 下 query.setParameter(":STGeomFromText",":STGeomFromText");[/quote] 不行啊,冒号就是传不过去。
skyWalker_ONLY 2014-10-14
  • 打赏
  • 举报
回复
引用 8 楼 u011702993 的回复:
[quote=引用 6 楼 sc6231565 的回复:] 在hql里面 你使用 :xxxx 这种格式,Hibernate 就会认为 你是要传参进去!
貌似还真是你说的这么回事,那肿么办?[/quote] 如果你没有参数的话,使用HQL直接执行查询就可以了
Magical茏 2014-10-14
  • 打赏
  • 举报
回复
引用 8 楼 u011702993 的回复:
[quote=引用 6 楼 sc6231565 的回复:] 在hql里面 你使用 :xxxx 这种格式,Hibernate 就会认为 你是要传参进去!
貌似还真是你说的这么回事,那肿么办?[/quote] 可以尝试 下 query.setParameter(":STGeomFromText",":STGeomFromText");
  • 打赏
  • 举报
回复
引用 6 楼 sc6231565 的回复:
在hql里面 你使用 :xxxx 这种格式,Hibernate 就会认为 你是要传参进去!
貌似还真是你说的这么回事,那肿么办?
skyWalker_ONLY 2014-10-14
  • 打赏
  • 举报
回复
select * from t_project p
left join t_position_face_test ft on ft.geom.STContains(geometry::STGeomFromText('POINT('+p.gpsx +' '+p.gpsy+')', 0)) = 1
where ft.id = 7
这句可以在执行成功的话,楼主试试将
Query query =super.getSession().createSQLQuery(sql).addEntity(classStr);
改为
Query query =super.getSession().createSQLQuery(sql);
Magical茏 2014-10-14
  • 打赏
  • 举报
回复
在hql里面 你使用 :xxxx 这种格式,Hibernate 就会认为 你是要传参进去!
EverWHL 2014-10-14
  • 打赏
  • 举报
回复

 [select p.* from t_project p left join t_region r on p.region_id = r.id left join t_position_face pf on pf.geom.STContains(geometry::STGeomFromText('POINT('+p.gpsx +' '+p.gpsy+')', 0)) = 1 where p.is_delete = 0 and r.is_delete = 0 and r.id = 354 and ( ( p.keywordid like '13' or p.keywordid like ',13' or p.keywordid like '13,' or p.keywordid like '13,%' or p.keywordid like '%,13,%' or p.keywordid like '%,13' ) or ( pf.id = 13 ) ) order by id desc]
试这个sql
  • 打赏
  • 举报
回复
引用 3 楼 EverWHL 的回复:
一个名称参数占位符没有赋上值 最好还是通过setParameter来传递参数最好。
引用 2 楼 sc6231565 的回复:
:STGeomFromText 要赋值?
Not all named parameters have been set: [:STGeomFromText]
引用 1 楼 sizhouzhou 的回复:
命名参数设置的不对,hibernate查询关联表之间的数据 是要配置一对多或者多对一的
不可能啊,那个根本就不是参数何来赋值一说? 而且这个SQL可以直接在数据库中运行的啊。 请注意我geom字段类型为geometry,STGeomFromText是geometry类型自带的。
EverWHL 2014-10-14
  • 打赏
  • 举报
回复
一个名称参数占位符没有赋上值 最好还是通过setParameter来传递参数最好。
Magical茏 2014-10-14
  • 打赏
  • 举报
回复
:STGeomFromText 要赋值?
Not all named parameters have been set: [:STGeomFromText]
LOVE-漂泊 2014-10-14
  • 打赏
  • 举报
回复
命名参数设置的不对,hibernate查询关联表之间的数据 是要配置一对多或者多对一的

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧