Java 使用Hibernate查询
我不熟悉hibernate查询,并试图掌握一切是如何工作的。我正在使用Hibernate3和NetBeans6.5 我有一个基本的项目设置,一直在玩弄如何做每件事。我从一个搜索查询开始。用户可以在其中的一个或多个字段中输入值 为了示例起见,该表将是具有first_name、middle_name、last_name列的Person 我找到的第一种方法是使用一个以firstName、middleName和lastName为参数的方法:Java 使用Hibernate查询,java,hibernate,hql,Java,Hibernate,Hql,我不熟悉hibernate查询,并试图掌握一切是如何工作的。我正在使用Hibernate3和NetBeans6.5 我有一个基本的项目设置,一直在玩弄如何做每件事。我从一个搜索查询开始。用户可以在其中的一个或多个字段中输入值 为了示例起见,该表将是具有first_name、middle_name、last_name列的Person 我找到的第一种方法是使用一个以firstName、middleName和lastName为参数的方法: Session session = HibernateUtil
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();
会话会话=HibernateUtil.getSessionFactory().getCurrentSession();
事务tx=会话.beginTransaction();
String query=“from Person where(first_name=:firstName或:firstName为null)”+
“和(中间名=:middleName或:middleName为空)”
“and(last_name=:lastname或:lastname为null)”;
Query q=session.createQuery(查询);
q、 设置字符串(“名字”,名字);
q、 设置字符串(“中间名”,中间名);
q、 设置字符串(“lastName”,lastName);
列表结果=(列表)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();
会话会话=HibernateUtil.getSessionFactory().getCurrentSession();
事务tx=会话.beginTransaction();
Criteria crit=session.createCriteria(Person.class);
if(firstName!=null){
标准添加(Expression.eq(“firstName”,firstName);
}
if(middleName!=null){
标准添加(表达式eq(“middleName”,middleName);
}
if(lastName!=null){
标准添加(Expression.eq(“lastName”,lastName);
}
列表结果=(列表)crit.List();
所以我想弄清楚的是,对于这种类型的查询,哪种方式是首选方式?条件还是查询?为什么?
我猜Criteria是首选方法,您应该只在出于性能类型原因需要手动编写查询时使用。我是否接近?Criteria是首选方法。它在后台使用预处理语句,因此您不必担心SQL注入。Criteria是首选方法。它使用预处理状态标准是较新的方法。它是在hql查询层之后引入的。在标准api下面仍然生成hql。我倾向于使用标准api,因为代码看起来更干净,更易于维护。标准是较新的方法。它是在hql查询层之后引入的r hql查询层。在Criteria api下面仍然生成hql。我倾向于使用Criteria api,因为代码看起来更干净,更易于维护。我相信编写查询非常常见,特别是当您想要进行复杂查询时,Hibernate有自己的查询语言
Check我相信编写查询是非常常见的,特别是当您想要进行复杂的查询时,Hibernate有自己的查询语言
Check条件是进行动态查询的最佳方式。不需要对参数进行空检查,只需不添加该条件。条件是进行动态查询的最佳方式。不需要对参数进行空检查,只需不添加该条件。这会产生自。感谢您的输入。我上一次使用Query forr性能原因是否准确?@jschoen我相信当您使用条件时,hibernate会为您创建一个最佳查询,因此性能不应该是一个问题。这使我们从中受益。感谢您的输入。那么,我最后一次使用性能原因查询的语句是否准确?@jschoen我相信hibernate会在您使用条件时为您创建一个最佳查询您使用标准,所以性能不应该是一个问题。谢谢,这就是我认为它会做的,只是不确定,因为大多数信息都是关于编写HQL查询的。谢谢,这就是我认为它会做的,只是不确定,因为大多数信息都是关于编写HQL查询的。请注意,您的Expression.ge可能应该是ExpreSession.eqThanks.我会说这是个打字错误,但那是个谎言。我想知道“ge”代表什么。里面有各种各样的东西。再次感谢。“ge”代表“大于或等于”。只是一张便条,你的表情。ge可能应该是Expression.eqThanks。我会说这是个打字错误,但那是个谎言。我想知道“ge”代表什么。里面有各种各样的东西。再次感谢。“ge”代表“大于或等于”。