2010-03-23 69 views
1

我对新的hibernate查询,并试图掌握如何一切工作。我在Netbeans 6.5中使用Hibernate 3。使用Hibernate查询

我有一个基本的项目建立,并一直在玩如何做一切。我从本质上开始搜索查询。用户可以在一个或多个字段中输入值。

为了示例的目的,该表将是具有列first_name,middle_name,last_name的Person。

我发现的第一种方式是有把名字,中间名,和lastName作为参数的方法:

Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
Transaction tx = session.beginTransaction(); 
String query = "from Person where (first_name = :firstName or :firstName is null) "+ 
       "and (middle_name = :middleName or :middleName is null) " 
       "and (last_name = :lastname or :lastName is null)"; 
Query q = session.createQuery(query); 
q.setString("firstName", firstName); 
q.setString("middleName", middleName); 
q.setString("lastName", lastName); 
List<Person> results = (List<Person>) q.list(); 

这并没有跟我坐好,因为它好像我不应该写那么多,那么,我做错了。于是我不停地挖,发现另一种方式:

Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
Transaction tx = session.beginTransaction(); 
Criteria crit = session.createCriteria(Person.class); 
if (firstName != null) { 
    crit.add(Expression.eq("firstName", firstName); 
} 
if (middleName != null) { 
    crit.add(Expression.eq("middleName", middleName); 
} 
if (lastName != null) { 
    crit.add(Expression.eq("lastName", lastName); 
} 
List<Person> results = (List<Person>) crit.list(); 

所以我试图找出是哪一种方式是这种类型的查询的首选方法是什么?标准或查询?为什么?

我在猜测Criteria是首选方式,当您需要手动编写Query时,为了性能类型的原因,您应该只使用Query。我关门了吗?

+1

只是说明一下,你的Expression.ge应该可能是Expression.eq – 2010-03-23 16:54:46

+0

谢谢。我会说这是一个错字,但这将是一个谎言。我想知道要'ge'代表。那里有各种各样的东西。再次感谢。 – 2010-03-23 18:03:16

+0

“ge”代表“大于或等于”。 – 2010-03-23 19:58:19

回答

3

标准是首选的方法。它在后台使用Prepared Statements,因此您不必担心SQL注入。

+0

因为。欣赏输入。那么为了性能的原因,我最后的陈述是否准确使用Query? – 2010-03-23 15:40:45

+0

@jschoen我相信当你使用Criteria时,hibernate会为你创建一个最佳查询,所以性能不应该成为问题。 – 2010-03-23 17:15:15

2

准则是更新的方法。它是在hql查询层之后引入的。在Criteria下面,api仍然会生成hql。我倾向于使用Criteria API,因为代码看起来更干净,更容易维护。

+0

谢谢,那是我认为它做的,只是不确定,因为大部分信息都是关于编写HQL查询的。 – 2010-03-23 15:46:17

1

标准是使动态查询的最佳方式。不需要对参数进行空值检查,只是不要添加该标准。