Java 获取数据库查询结果HQL
我正在运行一个登录脚本,该脚本在数据库中查询有效的用户名/哈希对。代码如下:Java 获取数据库查询结果HQL,java,mysql,jakarta-ee,jboss,ejb,Java,Mysql,Jakarta Ee,Jboss,Ejb,我正在运行一个登录脚本,该脚本在数据库中查询有效的用户名/哈希对。代码如下: @Override public boolean login(User user) { // Check if we have a valid user/pass pair Query query = (Query) entityManager.createQuery("SELECT u FROM User u WHERE u.username=:userName AND u.password=:pas
@Override
public boolean login(User user) {
// Check if we have a valid user/pass pair
Query query = (Query) entityManager.createQuery("SELECT u FROM User u WHERE u.username=:userName AND u.password=:password");
((javax.persistence.Query) query).setParameter("userName", user.getUsername());
// We need to hash the password first before comparing it(as we only store the SHA-512 hash)
String tohash = user.getPassword();
String hash = null;
try {
// Create MessageDigest instance for MD5
MessageDigest md = MessageDigest.getInstance("SHA-512");
// Add password bytes to digest
md.update(tohash.getBytes());
// Get the hash's bytes
byte[] bytes = md.digest();
// This bytes[] has bytes in decimal format;
// Convert it to hexadecimal format
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100,
16).substring(1));
}
// Get complete hashed password in hex format
hash = sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
((javax.persistence.Query) query).setParameter("password", hash);
List<User> users = castList(User.class, ((javax.persistence.Query) query).getResultList());
if(users != null && !users.isEmpty()) {
// return "Welcome " + user.getUsername() + "!";
return true;
} else {
// return "Username or password are not valid";
return false;
}
}
@覆盖
公共布尔登录(用户){
//检查是否有有效的用户/通行证对
Query Query=(Query)entityManager.createQuery(“从用户u中选择u,其中u.username=:username和u.password=:password”);
((javax.persistence.Query)Query);
//我们需要先对密码进行散列,然后再进行比较(因为我们只存储SHA-512散列)
字符串tohash=user.getPassword();
字符串hash=null;
试一试{
//为MD5创建MessageDigest实例
MessageDigest md=MessageDigest.getInstance(“SHA-512”);
//添加要摘要的密码字节
md.update(tohash.getBytes());
//获取散列的字节数
byte[]bytes=md.digest();
//此字节[]具有十进制格式的字节;
//将其转换为十六进制格式
StringBuilder sb=新的StringBuilder();
for(int i=0;i
其中,castList用于指定列表中元素的类型(默认情况下获取列表会导致未定义类型警告)。代码如下:
public static <T> List<T> castList(Class<? extends T> clazz, Collection<?> c) {
List<T> r = new ArrayList<T>(c.size());
for(Object o: c)
r.add(clazz.cast(o));
return r;
}
公共静态列表castList(c类){
List r=新的数组列表(c.size());
用于(对象o:c)
r、 增加(分类铸造(o));
返回r;
}
即使表为空,上述方法也始终返回true。我遗漏了什么?桌子可能不是空的。或者是,但代码针对的是另一个数据库,而不是您正在查看的数据库。也就是说,所有这些无用的强制转换、空值检查和副本都会使代码比它应该的更难阅读。散列部分应该在一个单独的方法中;表是空的,正在使用的数据库是正确的(我可以插入值)。当表为空并且我启动该查询时,问题就会出现。如何检查查询是否成功?请确保在删除表中的所有内容后提交。如果表为空,查询将不会返回任何内容。您可以打印结果列表(或使用调试器检查其内容)以获得更多详细信息。另外,请参阅,以获得更可读(更高效、更正确)的代码版本。我只是想知道它不会返回!users.isEmpty();如果用户为空,则引发空指针异常?用户永远不会为空。getResultList()将始终返回非空列表,或引发异常。这是您自己的代码也应该遵循的一个良好实践:如果方法返回集合,它永远不应该返回null。如果不必返回任何内容,则返回空集合是正确的做法,因为调用方不必检查null,并且可以在不担心NPE的情况下进行迭代。