我应该在Hibernate中使用什么查询来获取POJO?

时间:2010-09-21 21:55:08

标签: java hibernate orm session jpa

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

我的删除代码是

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();
}

我的Db更新代码

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();
    }
}

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

1 个答案:

答案 0 :(得分:3)

您的意思是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代码段   从中检索用户对象   数据库:

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()方法永远不会   返回null。 get()方法   如果对象不能返回null   找到。

     

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

     

get()load()之间进行选择   很容易:如果你确定的话   持久对象存在,和   不会考虑不存在   例外,load()是一件好事   选项。如果你不确定有   具有给定的持久化实例   标识符,使用get()并测试   返回值以查看它是否为null。   使用load()还有一个问题   含义:申请可以   检索有效的引用(代理)   到没有的持久化实例   点击数据库来检索它   持久的状态。所以load()可能   如果没有,则不抛出异常   找到中的持久对象   缓存或数据库;例外   在代理人的时候被抛出   访问。

     

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

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

参考