如何使用Hibernate查询数据库?

时间:2014-07-21 10:03:37

标签: java database hibernate

我知道有些人可能会简单地回答这个问题"为什么你不仅仅是谷歌" ...但是我做了,我研究的越多,我就越困惑。我试图用Hibernate查询我的数据库,查询中有一个'其中'条款。

现在创建一个数据库条目很容易,如果我有一个用户'我只是这样做:

// Gets a new session
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();

// Creates a new User object
User user = new User("John", "p@55w0rd*", "john@doe.com");

// Save and commit
session.save(user);
session.getTransaction().commit();

但是当我以什么为例时我该怎么做

  

从id =' 3';

的用户中选择*

我的谷歌搜索指向了一个名为HQL的东西,这让我想知道为什么我不能直接使用直接JDBC。它似乎也不是面向对象的。然后有类似

的东西
  

session.createCriteria(.......

但我不确定如何使用这个..有什么帮助吗?谢谢你们。

4 个答案:

答案 0 :(得分:2)

当你使用Native Query(非HQL)时,你需要明确地告诉hibernate处理它,如下所示:

在下面的查询 createSQLQuery 是处理本机sql的特殊功能

String sql = "SELECT * FROM EMPLOYEE WHERE id = :employee_id";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(User.class);
query.setParameter("employee_id", 3);
List<User> results = query.list();

这可以使用标准来完成,以下是良好的起点:

  Criteria criteria = sess.createCriteria( User.class);
  List<User> users= criteria.list();

http://www.developerhelpway.com/framework/hibernate/criteria/index.php

答案 1 :(得分:0)

首先,您需要一个包含hibernate属性的hibernate.cfg.xml。这是例如网址,用户名和密码,驱动程序和方言。此文件放在名为resources的包中。

您必须在使用Hibernate Annotations example

之间进行选择

或使用hbm.xml文件example

这就是你如何告诉hibernate你的数据库是什么样的。它将根据您在例如user.hbm.xml中注释或定义的方式自动为您创建查询。

创建一个包含会话工厂的HibernateUtil.java类。

您可以使用

从数据库中获取数据
Criteria crit = getSessionFactory().getCurrentSession().createCriteria(User.class);

使用查询的示例:

  List<?> hibTuppleResultList = currentSession.createQuery(
      "from Person p, Employment e "
    + "where e.orgno like ? and p.ssn = e.ssn and p" 
    + ".bankno = ?")
       .setString(0, orgNo).setString(1, bankNo).list();

 for (Object aHibTuppleResultList : hibTuppleResultList)
    {
        Object[] tuple = (Object[]) aHibTuppleResultList;
        Person person = (Person) tuple[0];
        hibList.add(person);
    }

答案 2 :(得分:0)

Query q = session.createQuery("from User as u where u.id = :u.id");

q.setString("id", "3");

List result = q.list();

使用条件查询:

Criteria cr = session.createCriteria(User.class);
List results = cr.list();

对条件的限制:

Criteria cr = session.createCriteria(User.class);
cr.add(Restrictions.eq("id", 3));
// You can add as many as Restrictions as per your requirement
List results = cr.list();

您也可以像这样使用

List results = session.createCriteria(User.class).add(Restrictions.eq("id", 3)).list();

Crieteria Rsetriction查询的一些示例

Criteria cr = session.createCriteria(Employee.class);

// To get records having salary more than 2000
cr.add(Restrictions.gt("salary", 2000));

// To get records having salary less than 2000
cr.add(Restrictions.lt("salary", 2000));

// To get records having fistName starting with zara cr.add(Restrictions.like("firstName", "zara%"));

// Case sensitive form of the above restriction. 
cr.add(Restrictions.ilike("firstName", "zara%"));

// To get records having salary in between 1000 and 2000
cr.add(Restrictions.between("salary", 1000, 2000));

// To check if the given property is null 
cr.add(Restrictions.isNull("salary"));

// To check if the given property is not null 
cr.add(Restrictions.isNotNull("salary"));

// To check if the given property is empty 
cr.add(Restrictions.isEmpty("salary"));

// To check if the given property is not empty
cr.add(Restrictions.isNotEmpty("salary"));

您可以使用LogicalExpression限制创建AND或OR条件,如下所示:

Criteria cr = session.createCriteria(Employee.class);

Criterion salary = Restrictions.gt("salary", 2000);
Criterion name = Restrictions.ilike("firstNname","zara%");

// To get records matching with OR condistions
LogicalExpression orExp = Restrictions.or(salary, name);
cr.add( orExp );


// To get records matching with AND condistions
LogicalExpression andExp = Restrictions.and(salary, name);
cr.add( andExp );

List results = cr.list();

我认为这会对你有帮助

答案 3 :(得分:0)

最后,我真正想知道的是,如果你不想使用HQL,你会得到一些名为“条件查询”的东西,在我的情况下,我会这样做像这样的东西:

Criteria cr = session.createCriteria(User);
cr.add(Restrictions.eq("id", 3));
List results = cr.list();

我:&#34;谢谢!&#34; 我:&#34;没问题:)&#34;

PS - 我们真的可以删除这个问题。