EN
Hibernate - get HQL from TypedQuery
4 points
In this article, we would like to show how to get HQL query from TypedQuery
(from CriteriaQuery
) in Hibernate.
Quick solution:
xxxxxxxxxx
1
// import javax.persistence.EntityManager;
2
// import javax.persistence.TypedQuery;
3
// import javax.persistence.criteria.CriteriaBuilder;
4
// import javax.persistence.criteria.CriteriaQuery;
5
// import org.hibernate.query.Query
6
7
// import com.example.MyEntity;
8
9
10
EntityManager entityManager = ...; // to know how to get it check below examples
11
12
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
13
CriteriaQuery<MyEntity> criteriaQuery = criteriaBuilder.createQuery(MyEntity.class);
14
15
// query code here ...
16
17
TypedQuery<T> typedQuery = entityManager.createQuery(criteriaQuery);
18
Query hibernateQuery = typedQuery.unwrap(Query.class);
19
20
String hqlQuery = hibernateQuery.getQueryString(); // <--------------------------- HQL query
21
22
System.out.println(hqlQuery); // e.g. select generatedAlias0 from MyEntity as generatedAlias0
UsersController.java
file:
xxxxxxxxxx
1
package com.example;
2
3
import logic.database.entity.crawler.CrawlerJobOfferDetailEntity;
4
import org.springframework.http.MediaType;
5
import org.springframework.stereotype.Controller;
6
import org.springframework.transaction.annotation.Transactional;
7
import org.springframework.web.bind.annotation.RequestMapping;
8
import org.springframework.web.bind.annotation.RequestMethod;
9
import org.springframework.web.bind.annotation.ResponseBody;
10
11
import javax.persistence.EntityManager;
12
import javax.persistence.PersistenceContext;
13
import javax.persistence.criteria.CriteriaBuilder;
14
import javax.persistence.criteria.CriteriaQuery;
15
import javax.persistence.criteria.Root;
16
17
import com.example.HqlUtils;
18
19
20
public class UsersController {
21
22
23
private EntityManager entityManager;
24
25
(
26
value = "/api/users/hql-query",
27
method = RequestMethod.GET,
28
produces = MediaType.TEXT_PLAIN_VALUE
29
)
30
31
32
public String getHqlQuery() {
33
34
CriteriaBuilder criteriaBuilder = this.entityManager.getCriteriaBuilder();
35
CriteriaQuery<Long> criteriaQuery = criteriaBuilder.createQuery(Long.class);
36
Root<UserEntity> rootPath = criteriaQuery.from(UserEntity.class);
37
38
criteriaQuery.select(criteriaBuilder.count(rootPath));
39
40
String hqlQuery = HqlUtils.renderHql(entityManager, criteriaQuery);
41
System.out.println(hqlQuery); // select count(generatedAlias0) from UserEntity as generatedAlias0
42
43
return hqlQuery;
44
}
45
}
HqlUtils.java
file:
xxxxxxxxxx
1
package com.example;
2
3
import org.hibernate.query.Query;
4
5
import javax.persistence.EntityManager;
6
import javax.persistence.TypedQuery;
7
import javax.persistence.criteria.CriteriaQuery;
8
9
public class HqlUtils {
10
11
private HqlUtils() {
12
// nothing here ...
13
}
14
15
public static String renderHql(Query hibernateQuery) {
16
return hibernateQuery.getQueryString();
17
}
18
19
public static <T> String renderHql(EntityManager entityManager, CriteriaQuery<T> criteriaQuery) {
20
TypedQuery<T> typedQuery = entityManager.createQuery(criteriaQuery);
21
Query hibernateQuery = typedQuery.unwrap(Query.class);
22
23
return renderHql(hibernateQuery);
24
}
25
}