在 Spring Boot 中使用 HQL 查询

Posted

技术标签:

【中文标题】在 Spring Boot 中使用 HQL 查询【英文标题】:using HQL queries in Spring Boot 【发布时间】:2018-06-02 08:15:32 【问题描述】:

我有一个包含多个模型类的 Spring Boot 项目

我想在我的 DAO 实现中使用多个模型类。

谁能在这里解释一下如何使用 HQL 查询。

我看到的大多数示例都使用 CRUDRepository。但据我了解,这将我们限制在一个模型类(如果我的理解有误,请纠正我)。

其次,使用 CRUDRepository 将我限制在非常具体的方法上。但我需要的 HQL 查询可能更复杂,例如:

Query query = session.createQuery(from Employee where name=:name and place=:place and phone=:phone and gender=:gender);

即使对于像这样的 HQL 查询也使用 CRUDRepository 是标准做法吗? 否则我怎么能使用这样的 HQL 查询。 (如果可能,还请添加我需要添加的所有依赖项和注释)。我正在使用 Hibernate 和 postgres。

【问题讨论】:

这里是文档。它包含您所有问题的答案以及更多信息:docs.spring.io/spring-data/jpa/docs/current/reference/html/… 【参考方案1】:

如果您希望在不使用存储库等的情况下执行 动态 HQL 查询,这对我来说非常有用:

    @Autowired
    EntityManager entityManager;

    @RequestMapping("/query")
    @ResponseBody
    public String testQuery() 

        Query query = entityManager.createQuery("select u from User u");
        List<User> users = query.getResultList();
        users.forEach(u -> System.out.println(u.getFirstname()));
        return "See Console";
    

它的好处是,如果您很快想要测试查询,并且您正在使用 Spring LiveReload、JRebel、DCEVM 或 HotSwap 等 Hybris,您可以更改查询并保存和刷新。

【讨论】:

【参考方案2】:

CRUD 存储库是编写 DAO 的标准方法。如果您查看文档,您会发现您可以使用实体的字段进行复杂查询(这可能非常复杂,我鼓励您在查询方法部分查看here - 4.3),如果您想要更复杂的方法,可以在方法上使用注解@Query

@Repository
interface MyRepo implements JpaRepository<MyEntity,Long> 
     @Query("your custom query here")
     MyEntity findByFeature(String a)

现在您可以在查询中插入查询并访问您的String a(例如Select u where u.name="blabla",其中blabla 是您的输入字符串)

@Query 与存储库具有相同的依赖关系(我认为spring-boot-starter-data-jpa 就足够了)

【讨论】:

【参考方案3】:

JpaRepository 使用起来确实很棒,但对于必须使用复杂 HQL 查询的人(由于贵组织的建议等),我是这样做的:

    通过在您的配置中注入以下 bean 来获取会话工厂:

    @豆 公共 SessionFactory sessionFactory(@Qualifier("entityManagerFactory") EntityManagerFactory emf) 返回 emf.unwrap(SessionFactory.class);

    将 EntityScan 和 ComponentScan 添加到您的配置类

    @EntityScan(basePackages = "com.app.persistence" ) @ComponentScan(basePackages = "com.app" )

    继续使用任何 HQL 查询:

    @自动连线 SessionFactory 工厂;

    @Override
    public String check() 
        Session session = null;
        try 
            session = factory.openSession();
            Query query = session.createQuery("from Test");
            List<Test> res = query.list();
            Test sing = res.get(0);
            return sing.getName();
    
         catch (Exception e) 
            System.out.println("Exception in Dao");
            e.printStackTrace();
            throw e;
         finally 
            if (session != null) 
                session.close();
            
        
    
    

注意:我假设配置 DataSource 等其他事情都已经处理好了。

如果我的理解或方式有误,任何人都可以随时纠正我。

但是这种方式对我来说效果很好! :)

【讨论】:

以上是关于在 Spring Boot 中使用 HQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 IntelliJ HQL 控制台以使用 Spring Boot

Spring Boot JPA中的自定义查询问题

使用spring-boot在Jpa查询中出错

springboot jpa自定义查询

spring boot 对数据库的自定义查询

spring boot jpahql语句报错 :antlr.NoViableAltException: unexpected token: roleName