代码之家  ›  专栏  ›  技术社区  ›  Jacob Schoen

使用hibernate查询

  •  1
  • Jacob Schoen  · 技术社区  · 14 年前

    我对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();
    

    我对此并不满意,因为我似乎不应该写那么多,而且,我做错了。所以我继续挖掘,找到了另一条路:

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

    所以我想弄清楚的是,对于这种类型的查询,哪种方式是首选的?条件还是查询?为什么?

    我猜条件是首选的方式,并且您应该只在出于性能类型的原因需要手动编写查询时才使用查询。我接近了吗?

    4 回复  |  直到 14 年前
        1
  •  3
  •   Kevin Crowell    14 年前

    标准是首选方法。它在后台使用准备好的语句,所以不必担心sql注入。

        2
  •  2
  •   Robby Pond    14 年前

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

        3
  •  1
  •   mohdajami    14 年前

    我相信编写查询是非常常见的,特别是当您想进行复杂的查询时,hibernate有自己的查询语言。

    检查 Hibernate Query Language HQL

        4
  •  1
  •   dotjoe    14 年前

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