【发布时间】:2017-07-11 06:28:18
【问题描述】:
所以我已经用 Wildfly 和 MySql 设置了休眠。
查询有效,但查询 UTF-8 字符名称时出现问题。
在 MySql 上:
SELECT * FROM users WHERE firstname = "ნიკა";
不会导致空集。
在java中:
Session session = HibernateUtils.getSession();
String name = request.getParameter("name");
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<UsersEntity> query = builder.createQuery(UsersEntity.class);
Root<UsersEntity> usersRoot = query.from(UsersEntity.class);
query.select(usersRoot)
.where(builder.equal(usersRoot.get("firstname"), name));
List<UsersEntity> list = session.createQuery(query).list();
session.close();
writeUsers(list, response.getWriter());
查询localhost:8080/main?name=ნიკა时结果为空集
我该如何解决这个问题?
更新:
我在查询所有数据并显示它们时也有问题 非英文字符替换为问号。
更新 2:
此代码导致浏览器上显示问号:
response.getWriter().write("ნიკა ჩხარტიშვილი");
虽然这个工作正常:
response.setCharacterEncoding("UTF-8");
response.getWriter().write("ნიკა ჩხარტიშვილი");
当使用此查询SELECT * FROM users WHERE username='ნიკა' 查询数据库时,数据库会收到问号而不是ნიკა(这就是在wireshark 中显示的内容)。
我认为这是野蝇问题,因为它正确接收了 UTF-8,但除非指定发送 UTF-8,否则会发送问号。
【问题讨论】:
-
如果为了测试您可以在代码中硬编码名称,它是否也有效。如果是这样,那就是浏览器完成的翻译。
-
@davejal 硬编码也不行。
-
您的 SQL 示例使用
firstname = "ნიკა"。您的 URL 示例使用localhost:8080/main?name=ნიკა。如果您在调用writeUsers后关闭会话会发生什么情况?writeUsers调用有什么作用? -
它只是将名称输出到
response.getWriter()中,不能这样,因为localhost:8080/main?name=dato可以正常工作。
标签: java mysql hibernate utf-8 wildfly