跳到主要内容

Hibernate 是否支持原生 SQL 查询?

参考答案:

是的,Hibernate 支持原生 SQL 查询。Hibernate 提供了多种方式来执行原生 SQL 查询,并能够将查询结果映射到 Java 对象中。以下是一些常用的方法:

  1. 使用 createSQLQuery 方法: 你可以使用 SessioncreateSQLQuery 方法来创建并执行原生 SQL 查询。
Session session = sessionFactory.openSession();
String sql = "SELECT * FROM your_table WHERE id = :id";
SQLQuery query = session.createSQLQuery(sql);
query.setParameter("id", 123);
List results = query.list();
  1. 使用 createNativeQuery 方法(JPA 风格): 如果你正在使用 Hibernate 作为 JPA 提供商,你可以使用 EntityManagercreateNativeQuery 方法。
EntityManager entityManager = entityManagerFactory.createEntityManager();
String sql = "SELECT * FROM your_table WHERE id = :id";
Query query = entityManager.createNativeQuery(sql, YourEntityClass.class);
query.setParameter("id", 123);
List<YourEntityClass> results = query.getResultList();
  1. 使用 addEntity 方法将结果映射到实体类: 如果你希望将查询结果映射到特定的实体类,你可以使用 addEntity 方法。
String sql = "SELECT * FROM your_table WHERE id = :id";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(YourEntityClass.class);
query.setParameter("id", 123);
List<YourEntityClass> results = query.list();
  1. 使用 addScalar 方法获取简单数据类型: 对于不是实体类的简单数据类型,你可以使用 addScalar 方法。
String sql = "SELECT count(*) FROM your_table";
SQLQuery query = session.createSQLQuery(sql);
query.addScalar("count", Hibernate.LONG);
Long count = (Long) query.uniqueResult();

注意:尽管 Hibernate 支持原生 SQL 查询,但在可能的情况下,最好使用 HQL(Hibernate Query Language)或 Criteria API,因为这些查询是面向对象的,并且更容易维护和扩展。使用原生 SQL 可能会导致数据库依赖性,并且可能在数据库方言之间引入不兼容性。