【问题标题】:Running into NullPointerException with Hibernate使用 Hibernate 遇到 NullPointerException
【发布时间】:2016-05-09 14:15:00
【问题描述】:

在下面的代码中,第 13 行导致了 NullPointerException,而对于我来说,我不知道为什么:

1        byte[] hash;
2        byte[] salt;
3        
4        JsonObject jsonObject = new JsonParser().parse(request).getAsJsonObject();
5        String username = jsonObject.get("mUsername").getAsString();
6        char[] password = jsonObject.get("mPassword").getAsString().toCharArray();
7        
8        String HQLGetUser = "SELECT User FROM User WHERE mUsername = :username";
9        
10        Session session = HibernateUtilities.openSession();
11        session.beginTransaction();
12        
13        User user = session.createQuery(HQLGetUser)
14                .setString("username", username)
15                .list();
16        
17        session.getTransaction().commit();
18        session.close();
19        
20        hash = user.get(0).getHash();
21        salt = user.get(0).getSalt();

数据库肯定有我正在搜索的用户名的记录。我尝试创建一个查询并使用相同的会话对象调用get(User.class, userId),使用主键而不是用户名字符串来搜索记录,它返回了一个User 对象,因此肯定正在配置SessionFactory。我还使用以下方法查询了 phpmyadmin 中的数据库:

select * from user where username = :username

我也得到了我想要的唱片。任何想法为什么我会得到 NullPointerException?

更新:这是我的用户类的代码引用:

@Entity
@Table(name="user")
public class User implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private Long mId;

    @Column(name="username")
    private String mUsername;

    @Column(name="hash")
    private byte[] mHash;

    @Column(name="salt")
    private byte[] mSalt;
}

【问题讨论】:

  • 尝试将您的语句拆分为单独的调用,并确定 setStringuniqueResult 调用中的哪一个在 NPE 上。另外,您是否真的在此处看到的代码之外设置了username
  • 你在哪里设置username
  • @Riaz 我添加了我设置用户名的代码
  • @radimpe 我试过了,NPE 是在创建查询行引起的
  • 调试器是你的朋友。

标签: java hibernate jsp nullpointerexception


【解决方案1】:

Hibernate HQL 查询与 SQL 查询不同,语法也不同。尝试删除“SELECT User”位并进行查询:

FROM User WHERE mUsername = :username

或者,您可以保留查询并更改方法调用

session.createQuery

session.createSQLQuery

看看会不会有影响。

【讨论】:

    【解决方案2】:

    解决了。只需从 hql 查询中删除 SELECT USER

    【讨论】:

    • 这就是@Riaz 在他的回答中所说的。
    • @radimpe 哈哈。现在才意识到。当我阅读它时,我没有看到“Alternatively”,所以我认为他是在建议同时做这两件事
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多