【问题标题】:What Query should i use in Hibernate to fetch POJO?我应该在 Hibernate 中使用什么查询来获取 POJO?
【发布时间】:2010-09-22 14:10:56
【问题描述】:

我学习了 Hibernate 并用它在很大程度上减少了我的 Java 代码,并且还能够 减少花费在数据库上的时间。现在我应该使用什么类型的查询来完成我的 用于获取要显示的数据库列表、更新和删除的操作。

我的删除代码是

String newToken = "DELETEUSER";
if(!TokenManager.checkRoleToken(newToken)){
    return;
}
Session session = Main.getSession(); //calling the main method to get sesion 
Leavetable table = new Leavetable; // intialisation of object table
try{
    Transaction tr = session.beginTransaction();
    table = session.createQuery();
    session.delete(table); // deletion of the object and its properties  from selected leaveID
    tr.commit();            
}
finally{
    session.close();
}

我的数据库更新代码

public void updateLeaveTable( Leavetable leave ) {
    String newToken = "ADDUSER";
    if( !TokenManager.checkRoleToken( newToken ) ) {
        return;
    }
    Session session = Main.getSession(); // calling the main method to get
                                         // session
    try {
        session = Main.getSession();
        Transaction tr = session.beginTransaction();
        session.saveOrUpdate( leave ); // here without query the table gets
                                       // updated How?
        tr.commit();
    }
    finally {
        session.close();
    }
}

我应该遵循什么类型的查询。我进入项目之前的最后一项任务。当我 知道这将开始我作为开发人员的生活。请有任何建议。

【问题讨论】:

    标签: java hibernate orm session jpa


    【解决方案1】:

    您的意思是 HQL 查询吗?好吧,对 Leavetable 实体的典型查询如下所示:

    Query q = session.createQuery("from Leavetable t where t.someField = :value");
    q.setParameter("value", foo);
    List<Leavetable> results = q.list();
    

    但是,如果您只想按标识符检索实体,请参阅 Session#load()Session#get()。我不想让事情变得太混乱,但是虽然这两种方法相似,但它们之间有一个重要的区别。引用Hibernate Forums

    通过标识符检索对象

    下面的Hibernate代码sn -p 从 数据库:

    User user = (User) session.get(User.class, userID);
    

    get() 方法很特别,因为 该标识符唯一标识一个 类的单个实例。因此它是 常见的应用程序使用 标识符作为一个方便的句柄 持久对象。检索方式 标识符可以在什么时候使用缓存 检索对象,避免 如果对象已经存在,则数据库命中 缓存。 Hibernate 还提供了一个 load()方法:

    User user = (User) session.load(User.class, userID);
    

    load() 方法较旧; get() 是 由于用户添加到 Hibernate 的 API 要求。差别不大:

    如果load() 找不到对象 缓存或数据库,例外是 抛出。 load() 方法永远不会 返回空值。 get() 方法 如果对象不能是,则返回 null 找到了。

    load() 方法可能会返回一个代理 而不是真正的持久实例。 代理是触发的占位符 加载真实对象时 首次访问;我们 在本节后面讨论代理。 另一方面,get() 从不 返回一个代理。

    get()load() 之间进行选择 很简单: 如果您确定 持久对象存在,并且 不存在将被视为 特殊的,load() 很好 选项。如果您不确定是否存在 具有给定的持久实例 标识符,使用get() 并测试 返回值以查看它是否为空。 使用load() 有更进一步的 含义:该应用程序可能 检索有效参考(代理) 到一个持久实例,没有 击中数据库以检索其 持久状态。所以load()可能 不抛出异常时不抛出 在 缓存或数据库;例外是 稍后抛出,当代理是 访问。

    当然,通过 标识符不如使用灵活 任意查询。

    另请参阅 Hibernate 文档(以下链接)。

    参考

    【讨论】:

    • @pascal 非常感谢,我可以这样写我的 Hql 查询吗 Query q = session.createQuery("from Leavetable t where t.leaveID = :id"); q.setParameter("id", ...);那个 foo 表示听到什么
    • @pascal 对于更新,我似乎不需要查询,hibernate 为我做了。 session.saveOrUpdate(离开)。我说得对吗
    • @Code 那 foo 只是一个随机的例子,因为我不知道 Leavetable 是什么样子的 :) 但是我已经添加了更多关于通过标识符检索对象的方法的详细信息,因为我现在明白了这可能是您最初的意图(与“通用”查询相比)。
    • @非常感谢您让我了解这两种方法及其区别。
    • @ya 我找到了,foo 是通过我的方法传递的 id 值。
    猜你喜欢
    • 2023-03-14
    • 2011-01-10
    • 1970-01-01
    • 2011-10-14
    • 2015-12-09
    • 2012-01-08
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    相关资源
    最近更新 更多