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个回答

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

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






org.hibernate.dialect.MySQLDialect

true
utf8
true

org.hibernate.hql.classic.ClassicQueryTranslatorFactory



[/code]

你的hql语句没问题,我想是符合这个条件的数据没有

把user换个名字试试看?

我关心的是你连接上数据库了吗……

那很有可能是你的sql有问题,你用p6spy看一下真正的sql代码是什么样的,看看数据是否正确。

下载地址:http://www.p6spy.com/

使用方式(网上搜的):http://www.blogjava.net/qclass/archive/2006/08/21/64692.html

信息太少看不问题

所以说让你装个p6spy看一下hibernate到底生成了什么样的sql语句呀……

你换个过滤器看看 我一般都用的是这个都不会出现你那种情况
package org.shj.hotels.filter;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class Filter implements javax.servlet.Filter {

public void destroy() {
    // TODO Auto-generated method stub

}

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    request.setCharacterEncoding("utf-8");
    response.setCharacterEncoding("utf-8");
    chain.doFilter(request, response);
}

public void init(FilterConfig arg0) throws ServletException {
    System.out.println("过滤器初始化!");

}

}

web.xml 配置文件写

filter
org.shj.hotels.filter.Filter


filter
/*

用这个试试看行不行

重你写的代码来看是没有错,就是乱码问题 你换个过滤器看看你写的也没有错

肯定乱码了.而且乱码应该是数据库端的,如果是微软数据库,你可以尝试使用jtds

共17条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐