How would represent the following Oracle SQL in Hibernate HQL.
select table_num
, room_id
, min(event_type) keep(dense_rank first order by changed_on desc)
from room_history
group by table_num, room_id;
The idea behind the query is to order the table "room_history" by "changed_on" datetime column and then group it by "table_num" and "room_id" pairs whilest keeping the first "event_type" for each group. The mentioned query works for Oracle but I have trouble converting it into HQL.
Purpose is to get the latest "event_type" for "table_num" and "room_id" pair.
It seems this is not achievable
I ended up converting the following SQL query instead. It is not perfect but it does the job for my purposes.
select table_num, event_type et from room_history where id in (select max(id) from privacy_history group by msisdn);
I was able to do this assumptions since when for this table always a.id > b.id then also a.changed_on> b.changed_on.
Related
I have a rather simple query that works in standard SQL, but doesn't in HQL :
SELECT id
FROM ( SELECT COUNT(*) as rows,
MESSAGES_ID as id
FROM motcles_message mm
WHERE motcle IN :keyWords
GROUP BY MESSAGES_ID) a
WHERE a.rows = :size
Is there any way for me to avoid using a subquery in the FROM statement since HQL doesn't support it ?
I know it can use subqueries in SELECT and WHERE clauses, but I can't find a solution.
SELECT MESSAGES_ID as id
FROM motcles_message mm
WHERE motcle IN :keyWords
GROUP BY MESSAGES_ID
HAVING COUNT(*) = :size
i came into a situation where i want to select rows which meets within some date.
i am using oracle and my query looks like :-
Query
SELECT d.id,d.ADVERTISEMENTCODE,d.LASTDATEOFFORMSUBMISSION,e.LASTDATEFORFORMSUBMISSION,
d.studentMasterId FROM CANDIDATEAPPEARAGAINSTADVTCODE d LEFT OUTER JOIN ADVERTISEMENTCODE e
ON d.ADVERTISEMENTCODE = e.ADVERTISEMENTCODE WHERE paymentStatus='Pending'
and studentMasterId='8670' and
TO_DATE(e.LASTDATEFORFORMSUBMISSION,'dd/mm/yyyy')+4 > TO_DATE('11/05/2017','dd/mm/yyyy');
this is a running query and it returns exactly what i want.
but now i want to do it with hibernate query language. how can it be done?
I am using NamedParameterJdbcTemplate to run my query. The query is like:
SELECT id, desc FROM tableA WHERE id IN (:custIds);
Now, I am calling a web service and it is returning a List of ids. So I used NamedParameterJdbcTemplate to map the List of ids to "custIds". However, I got an issue when the List of ids reaches more than 1000. I've read that the DB will not be able to process a IN containing more than 100 or 1000.
As I am restricted to only receiving a List of ids, can you suggest what's best to use aside from NamedParameterJdbcTemplate?
You can't use more than 1000 entries in IN clause. There are few solutions as mentioned below:
Use inner query to solve this issue. You can create a temporary table and use that in your IN clause.
sample query:
select id,desc from table_name where id in (select id from temp_table)
Break it in the batch of 1000 entries using multiple IN clause separated by OR clause.
sample query:
select id,desc from table_name
where
id in (1,2,3,...1000)
or
id in (1001,1002,1003,...2000)
or
id in (2001,2002,...)
Alternately use union all instead of OR clause as mentioned above with queries of 1000 entries in IN clause
sample query:
select id,desc from table_name where id in (1,2,3,4,...,1000)
union all
select id,desc from table_name where id in (1001,1002,...2000)
union all
select id,desc from table_name where id in (2001,2002,...)
Read more.. and see Oracle FAQ
Excuse me for anking again about this issue but I need to have a JPA query for this:
select username, count(*)
from Records
group by username
order by count(*) desc
limit 1
I thought about smth like:
select r.username,count(*) from Records r order by r.username desc
and then to call
getResultList().get(0)
but I am allowed to write only:
select r from Records r order by r.username desc
and in this case I do not know how to get what I need.
Does anyone have any idea?
The SQL query has a group by, and orders by count. The JPA query doesn't have any group by and orders by user name. So I don't see how they could return the same thing.
The equivalent JPQL query is
select r.username, count(r.id)
from Record r
group by r.username
order by count(r.id) desc
If you call setMaxResults(1) on the Query object, the limit clause will be added to the generated SQL query, making it completely equivalent.
I am trying to get distinct values from table application based on the column entry_id. I've managed to get this working with plain SQL:
SELECT DISTINCT ON (a.entry_id) a.* FROM application AS a
JOIN entry AS e ON e.id = a.entry_id
WHERE e.valid_until BETWEEN ? AND ?;
The problem is, I have to translate it to HQL. Is there any way to resolve it in HQL without Criteria API?
It looks like this feature has been requested a long time ago but is still unresolved.