Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Hibernate查询_Java_Hibernate_Hql - Fatal编程技术网

Java 使用Hibernate查询

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

我不熟悉hibernate查询,并试图掌握一切是如何工作的。我正在使用Hibernate3和NetBeans6.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();
会话会话=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”代表“大于或等于”。