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的情况下进行迭代。