我是hibernate查询的新手,并试图掌握一切是如何工作的。我正在使用Hibernate 3和Netbeans 6.5。
我有一个基本的项目设置,并一直在玩如何做所有事情。我开始基本上是一个搜索查询。用户可以在一个或多个字段中输入值。
为了示例,该表将是具有列first_name,middle_name,last_name的Person。
我找到的第一种方法是使用firstName,middleName和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。我接近了吗?
答案 0 :(得分:3)
标准是首选方式。它在后台使用Prepared Statements,因此您无需担心SQL注入。
答案 1 :(得分:2)
标准是更新的方式。它是在hql查询层之后引入的。在Criteria下面,api仍会生成hql。我倾向于使用Criteria api,因为代码看起来更干净,更容易维护。
答案 2 :(得分:1)
我认为编写查询非常常见,特别是当你想进行复杂的查询时,Hibernate有自己的查询语言。
答案 3 :(得分:1)
标准是进行动态查询的最佳方式。不需要对参数进行空检查,只是不要添加该条件。