What is the difference between JPAQuery and JPAQueryFactory? And, When to use which?
According to the querydsl reference documentation:
Both JPAQuery and HibernateQuery implement the JPQLQuery interface.
For the examples of this chapter the queries are created via a JPAQueryFactory instance. JPAQueryFactory should be the preferred option to obtain JPAQuery instances.
But, I could not understand clearly. Can anyone explain it briefly?
What matters is that Hibernates query language (HQL) is a superset of JPA's query language (JPQL). Hibernate also has a special method for result set transformation and being able to iterate over scrollable result sets without the need to keep a reference to all records in memory. In order to take advantage of this extra functionality, the HQLTemplates
and the HibernateHandler
have to be used. The first is responsible for serializing the additional types of expressions, the second for the integration with Hibernates Query
implementation. The HibernateHandler
is actually obtained from the HQLTemplates
as well, so all that remains is specifying HQLTemplates
.
And in fact: a JPAQuery
instantiated with HQLTemplates.INSTANCE
for the Templates
variable, behaves the same as a HibernateQuery
. FWIW, if you provide an EntityManager
instance with the construction of your JPAQuery
, then the appropriate implementation for Templates
is deduced for your ORM vendor automatically.
All JPAQueryFactory
really is, is a factory method that binds the EntityManager
and Templates
variables for newly instantiated JPAQueries
. This eliminates the need to pass these as a variable individually for each instantiation of a JPAQuery
.
There is no need to use the JPAQueryFactory
, but it could make your code easier to read. Furthermore, a lot of code examples on the QueryDSL website utilize the query factory, so it might make it easier to use these examples as snippets in your own code.