tjzero_sapce 2009-04-08 16:12
浏览 348
已采纳

hql 有问题

一个登陆操作

业务逻辑中 这样写查询不出数据
[code="java"]String hql = "from Account user where user.employeeName = '"+object.getEmployeeName()+"'";
[/code]

用 from Account 测试了下 可以查询出数据

问题就是处在这个hql 语句上, 可是这种写法我一直都在用, 没有出现过问题 , 哪位高人能指点下啊.
[b]问题补充:[/b]
回一楼的 符合条件的数据确实是存在的 我使用sql语句可以查询出来在MyEclipse Database Explorer 中

例 如 select * from Account where EmployeeName = '刘总'

是确实能够查询出数据的.
[b]问题补充:[/b]
回2楼的 user 我也换过了 不行
[b]问题补充:[/b]
回3楼的 我开始的时候说了 使用from Account 测试了 在System.out.println(list.size());
的作用下, console 输入了 53 而使用String hql = "from Account user where user.employeeName = '"+object.getEmployeeName()+"'"; 什么结果是 0
[b]问题补充:[/b]
我在业务逻辑层的方法中这样写

[code="java"]public boolean isLoginSuccess(Account object) {
// TODO Auto-generated method stub
String hql = "from Account ";
System.out.println("看看业务逻辑层的hql"+hql);
List list = commonDAO.search(hql);
System.out.println("业务逻辑层这边的城市"+list.size());
if(list.size() > 0){
Account item = (Account)list.get(0);
if(object.getEmployeePwd().equals(item.getEmployeePwd())){
return true ;
}
}
return false ;
}[/code]

在DAO层方法是这样的

[code="java"]public List search(String hql) {
// TODO Auto-generated method stub
System.out.println("看看dao层的"+hql);
List temp = super.getHibernateTemplate().find(hql);
for(int i = 0 ; i < temp.size(); i++){
Account user = (Account)temp.get(i);
System.out.println(user.getEmployeeName());

}
System.out.println("看看dao层的"+temp.size());
return temp ;
}[/code]

想用全部查询来测试是否能够成功查询出Account 表中的 数据 , 结果是可以的

业务逻辑中方法改回这样

String hql = "from Account account where account.employeeName = '"+object.getEmployeeName()+"'";

就不行了 console 没输出数据 , list.size() 的输出结果是 0

我在ms sqlserver 的查询分析其中使用
select * from Account where EmployeeName = '刘总' 就查询出数据

自己也在dao层的方法中使用System.out.println(); 输出方法中使用 hql 语句, 都是很正常的, 会不会是hql 到了 ms sqlserver中 它的中文条件 '刘总' 被转义成了乱码 而不会从数据库中获取数据呢?
[b]问题补充:[/b]
利用log4j。properties 文件 和 在 applicationContext.xml中设置了

true 在 console 中输出了 被转义后的sql语句

[code="sql"]select account0_.EmployeeID as EmployeeID, account0_.EmployeeName as Employee2_0_, account0_.EmployeePwd as Employee3_0_, account0_.EmployeeRight as Employee4_0_, account0_.Remark as Remark0_ from xindunoadb.dbo.Account account0_ where account0_.EmployeeName='??×?'[/code]

很明显被转义后的查询条件成了乱码 这是怎么造成的呢?

我在web.xml是这样写的

[code="xml"]
encodingFilter

org.springframework.web.filter.CharacterEncodingFilter


encoding
utf-8


forceEncoding
true



encodingFilter
/*
[/code]

怎么还会出现乱码呢?

[b]问题补充:[/b]
清哪位帮忙看看 这个filter 的配置哪有问题 我以前是自己写filter 的 用了ssh 之后 才改用 提供了的这个 我另一个demo 中 也是使用spring 提供的类来做的, 是成功的了 没有道理这个不行啊

[b]问题补充:[/b]
在项目的lib 中 添加了jtds 1.2.jar 也修改applicationcontext.xml中的datasource 配置 , 结果重启tomcat 访问项目就报错了, 说无法创建FormBean了 不得以改回去了
[b]问题补充:[/b]
[quote]CharacterEncodingFilter中定义的和jsp页面的编码不一致吧
zkl_1987 (初级程序员) 2009-04-09 采纳为答案[/quote]

这个问题比较低级了 , 我也回头查了下 , 没有不统一的问题, 都是UTF-8
[b]问题补充:[/b]
[quote]囧rz 结果是编码问题 - -~
我怎么觉得是你的数据库编码有问题捏?

把建表sql发上来看看。

问题应该就是在数据库的编码上了。
iampurse (中级程序员) 2009-04-09[/quote]

这个数据库不是我设计的 是已走的"前辈"留下的 没有建库脚本就没有办法了么?
[b]问题补充:[/b]
[quote]突然想起来的,不知道你配置没有……我觉得你应该配置了,但是除此之外想不出其它原因:

Xml代码
utf8

utf8

hibernate的connection.characterEncoding属性。
Snow_Young (中级程序员) 2009-04-09[/quote]

这个我没有写...

请问这个配置是写在SessionFactory 或者 dateSource 中的哪个部分?
[b]问题补充:[/b]
[quote]突然想起来的,不知道你配置没有……我觉得你应该配置了,但是除此之外想不出其它原因:

Xml代码
utf8

hibernate的connection.characterEncoding属性。
Snow_Young (中级程序员) [/quote]

我配置
[code="xml"] utf8

true [/code]

没有变化.....

复制一下我使用log4j.properties 在consosle 输出的结果 :

[code="java"]08:56:02,046 DEBUG QueryTranslatorImpl:177 - HQL: from com.newshieldoa.common.pojo.Account account where account.employeeName = '刘总' and account.employeePwd = '.'
08:56:02,046 DEBUG QueryTranslatorImpl:178 - SQL: select account0_.EmployeeID as EmployeeID, account0_.EmployeeName as Employee2_0_, account0_.EmployeePwd as Employee3_0_, account0_.EmployeeRight as Employee4_0_, account0_.Remark as Remark0_ from xindunoadb.dbo.Account account0_ where account0_.EmployeeName='??×?' and account0_.EmployeePwd='.'[/code]
[b]问题补充:[/b]
[quote]
Java代码
String hql = "from Account user where user.employeeName = :employeeName";

Query query = session.createQuery(hql)

.setString("employeeName", object.getEmployeeName());

String hql = "from Account user where user.employeeName = :employeeName";

Query query = session.createQuery(hql)
.setString("employeeName", object.getEmployeeName());

另外你分数也给的太抠门了吧……
Snow_Young (中级程序员)[/quote]

呵呵 不是我抠门 我早就没有分了, 发帖之前就是 0 个金币, 我要是有200个 金币 早就全拿出来了 ....

您这个方法 我还没试 毕竟我习惯是在业务逻辑层把hql组织好传递进DAO层的, 您这个方法全是在DAO层做的
[b]问题补充:[/b]
[quote]拼的和 命名的都一样的效果吧 - -~

我还是觉得是你的数据库的问题。

数据库别人留下的 你也可以改的啊

alert 一下就好了嘛
iampurse (中级程序员) 2009-04-10[/quote]

我刚刚吧原来2000 的数据库 转移到了 2005 , 很遗憾 还是不行, 跟数据库没有关系了...
[b]问题补充:[/b]
我的上帝啊 终于不是乱码了 !!!!!!!!!!!!!!11

在 applicationContext.xml 中
sessionFactory 的配置信息中 配置了这样一段代码就搞定了
[code="xml"] org.hibernate.hql.classic.ClassicQueryTranslatorFactory [/code]
快2天了 终于把这该死的问题搞定了. 做个标记 ,为自己, 为别人.

  • 写回答

17条回答

  • iteye_2914 2009-04-09 21:29
    关注

    这个是写在sessionFactory里面的,例如:

    [code="xml"]
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">






    org.hibernate.dialect.MySQLDialect

    true
    utf8
    true

    org.hibernate.hql.classic.ClassicQueryTranslatorFactory



    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(16条)

报告相同问题?

悬赏问题

  • ¥15 想问一下stata17中这段代码哪里有问题呀
  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决