QueryDSL 4.x subqueries in the FROM clause - jpa

Are subqueries in the from clause supported in the latest QueryDSL version? I tried my best but could not find a solution for now.

This is not a QueryDSL issue, but a JPQL limitation. Support for subqueries exists only for Select and Where clauses. From the Hibernate documentation:
Note that HQL subqueries can occur only in the select or where clauses.
You need to use native queries if you wish to utilize subqueries in that fashion. For example, see JPA subquery in from clause for query migration. QueryDSL supports native queries, so the principles should be translatable.

Related

Subquery in FROM clause using CriteriaQuery

I need to implement select from a nested query, for the sake of simplicity let it be:
select * from (select * from city) c
How can this be done using CriteriaQuery and Subquery?
You can't because (select * from city) is not an entity and CritieriaAPI queries on entities not on tables.
The only way would be to create a view for (select * from city) and map that view to an entity.
First, your syntax is not JPA compliant as mentioned previously, secondly, you must know that subqueries in JPQL are allowed only in WHERE and HAVING clauses. The same applies to Criteria queries. If you need the more powerful SQL subquery features then with JPA you have to use JPA provisions for native queries, or otherwise, use another type of JDBC library.

QueryDsl JPA using subquery in from clause

is it possible in QueryDsl to perform a subquery in the from clause?
I would like to do something like:
SELECT * FROM
(Select Ammount, Ammount*(.10) as TenPercent From Expense)
Where TenPercent > 1
The general problem I am trying to solve is using a field from the projection (in this case TenPercent and PlusTenPerceent) in the where clause which can only be solved by using subqueries in the from clause.
How do you express this in QueryDsl? JPAExpressions do not solve this because it can not be used in the JPAQuery.from() method.
Any input is welcome!

JPA 1: JPQL for ORDER BY NULLS LAST

Is there a way to do an ordering in JPQL query like:
SELECT v
FROM Vehicle v
WHERE ...
ORDER BY v.lastUserUpdate DESC NULLS LAST, v.id DESC;
The NULLS LAST breaks the query. Is there a correct way to do this?
I don't know a JPQL function to allow this as I believe it is database specific. JPA 2.0 has a 'SQL' key word that you can use to have "nulls last" passed through. Something like
"ORDER BY v.lastUserUpdate DESC SQL('NULLS LAST'), ..."
See
http://java-persistence-performance.blogspot.ca/2012/05/jpql-vs-sql-have-both-with-eclipselink.html for more details on what is available in JPA and eclipselink. TopLink uses EclipsLink for JPA, so you will have to verify the version you are using and use native TopLink API if it doesn't support it and you can't upgrade.

QueryDSL - add subquery into FROM statement

I need to implement sql query like:
SELECT * FROM (SELECT a FROM b WHERE a.z = 1) WHERE rownum <=1;
How can I write such statement with QueryDSL (I am not using JPA and JDO - only clean sql)?
Querydsl SQL emulates paging of all the supports databases, so you can write directly
query.from(a)
.where(a.z.eq(1))
.limit(1)
.list(a);
If you need to write this via a subquery then like this
query.from(
new SQLSubQuery().from(a).where(a.z.eq(1)).list(a).as(a))
.where(rownum.loe(1))
.list(a);

JPA - MAX of COUNT or SELECT FROM SELECT

I wrote the following query for MySQL:
SELECT subquery.t1_column1,
subquery.t2_id,
MAX(subquery.val)
FROM (
SELECT t1.column1 as t1_column1,
t1.id_t2 AS t2_id,
count(1) AS val
FROM table1 t1
INNER JOIN table2 t2
ON t2.id = t1.id_t2
GROUP BY t1.id_t2
) subquery
GROUP BY t1_column1
And I'd like to translate it into JPA (JPQL or criteria query).
I don't know how to make this max(count) thing, and JPA doesn't seem to like the SELECT FROM SELECT...
If anyone has an idea other than native queries (I'll do it for now), it would be great.
I haven't checked tha JPA specification, but given that the Hibernate documentation says
Note that HQL subqueries can occur only in the select or where
clauses.
I very much doubt that your query can be transformed in a valid JPQL query.
You'll have to keep using this native SQL query.
JPA 2.0 JPQL does not support sub-selects in the from clause. You may want to try to rewrite your query, or use a native SQL query.
EclipseLink 2.4 will support sub-selects in the FROM clause,
see,
http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#Sub-selects_in_FROM_clause