You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring与Hibernate整合时如何执行自定义SQL字符串并返回持久化对象列表

嘿,我懂你现在的困惑——用惯了Spring JDBC里可以随便写自定义SQL来查询,转到Spring和Hibernate整合的环境后,想找个能执行自定义SQL还直接返回持久化对象列表的办法对吧?别担心,有好几种靠谱的方案能解决这个需求,我给你一一拆解:

可行实现方案

1. 借助HibernateTemplate获取Session,使用createSQLQuery()

你可以通过HibernateTemplate的execute()方法拿到Hibernate Session,然后用Session的createSQLQuery()执行自定义SQL,再通过addEntity()指定要映射的实体类,就能直接得到持久化对象的列表了。举个例子:

List<YourEntity> entityList = hibernateTemplate.execute(session -> {
    String customSql = "SELECT * FROM your_entity_table WHERE user_type = :type";
    return session.createSQLQuery(customSql)
                  .addEntity(YourEntity.class) // 绑定要映射的实体类
                  .setParameter("type", "ADMIN") // 设置SQL参数
                  .list();
});

这里要注意:SQL查询返回的字段名得和实体类的属性名(或者你通过@Column注解指定的数据库字段名)对应上,不然会出现映射失败的问题。

2. 用JPA的@NamedNativeQuery注解定义原生查询

如果你的项目兼容JPA(Spring+Hibernate一般都支持),可以直接在实体类上定义原生SQL查询,然后通过EntityManager调用,这种方式适合需要复用的查询。示例如下:
首先在你的实体类上添加注解:

@Entity
@Table(name = "your_entity_table")
@NamedNativeQuery(
    name = "YourEntity.findAdmins",
    query = "SELECT * FROM your_entity_table WHERE user_type = ?1",
    resultClass = YourEntity.class
)
public class YourEntity {
    // 实体类的属性、主键映射等
    @Id
    private Long id;
    private String userType;
    // getter、setter...
}

然后在DAO层或者Service层调用这个命名查询:

List<YourEntity> adminList = entityManager.createNamedQuery("YourEntity.findAdmins", YourEntity.class)
                                          .setParameter(1, "ADMIN")
                                          .getResultList();

3. 用Spring Data JPA的@Query(原生SQL模式)

如果你的项目引入了Spring Data JPA,那这个方法会更简洁——只需要在Repository接口里定义方法,加上@Query注解并开启原生SQL模式就行:

public interface YourEntityRepository extends JpaRepository<YourEntity, Long> {
    @Query(value = "SELECT * FROM your_entity_table WHERE user_type = :userType", nativeQuery = true)
    List<YourEntity> findByUserType(@Param("userType") String userType);
}

之后直接调用这个Repository的方法,Spring Data会自动帮你处理底层的Session管理和SQL执行,直接返回持久化对象列表,非常省心。

小提醒

  • 不管用哪种方法,都要确保自定义SQL返回的字段能和实体类的属性正确映射,如果字段名和属性名不一致,可以用@Column注解指定映射关系,或者在SQL里给字段起别名匹配属性名。
  • 如果是复杂的多表关联查询,可能需要定义DTO来接收结果,但如果只是单一实体的列表查询,上面的方案完全够用。

内容的提问来源于stack exchange,提问作者Mayank Kumar Thakur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 07:47:39