在Spring Boot中使用HQL查询

时间:2017-12-19 20:27:54

标签: spring postgresql hibernate spring-boot hibernate-mapping

我有一个Spring Boot项目,它有多个Model类

我想在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。

3 个答案:

答案 0 :(得分:0)

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就足够了)

答案 1 :(得分:0)

JpaRepository肯定很棒,但对于那些必须使用复杂的HQL查询的人(由于你的组织的推荐等),我就是这样做的:

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

    @Bean      public SessionFactory sessionFactory(@Qualifier(“entityManagerFactory”)EntityManagerFactory emf) {          return emf.unwrap(SessionFactory.class);      }

  2. 将EntityScan和ComponentScan添加到配置类

    @EntityScan(basePackages = {“com.app.persistence”}) @ComponentScan(basePackages = {“com.app”})

  3. 继续使用任何HQL查询:

    @Autowired     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();
            }
        }
    }
    
  4. 注意:我假设已经完成了配置DataSource等所有其他事情。

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

    但这样对我来说效果很好!! :)

答案 2 :(得分:0)

如果您希望在不使用存储库等的情况下执行动态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或带有Hybris的HotSwap之类的东西,则可以更改查询并保存并刷新。 / p>