在 Spring Boot 中使用 HQL 查询

Nav*_*mar 5 postgresql spring hibernate hibernate-mapping spring-boot

我有一个 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);
Run Code Online (Sandbox Code Playgroud)

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

Spi*_*der 5

如果您希望在不使用存储库等的情况下执行动态 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";
    }
Run Code Online (Sandbox Code Playgroud)

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


Guy*_*sky 1

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

@Repository
interface MyRepo implements JpaRepository<MyEntity,Long> {
     @Query("your custom query here")
     MyEntity findByFeature(String a)
}
Run Code Online (Sandbox Code Playgroud)

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

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