Reputation: 4180
I am trying to use this query from here - http://technoir.blog/blog/post/timeseries_tips_for_postgresql:
with filled_dates as (
select day, 0 as blank_count from
generate_series('2014-01-01 00:00'::timestamptz, current_date::timestamptz, '1 day')
as day
),
signup_counts as (
select date_trunc('day', created_at) as day, count(*) as signups
from users
group by date_trunc('day', created_at)
)
select filled_dates.day,
coalesce(signup_counts.signups, filled_dates.blank_count) as signups
from filled_dates
left outer join signup_counts on signup_counts.day = filled_dates.day
order by filled_dates.day
When I put this in @Query("WITH filled_dates as ( .... ")
, it throws this error -
Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: WITH near line 1, column 1 [WITH filled_dates as
How can I use WITH clause in manual JPA queries?
Upvotes: 4
Views: 12878
Reputation: 4956
Use nativeQuery=true
in the annotation to switch to plain SQL. Otherwise it expects JPQL queries.
@Query(value = "WITH filled_dates AS ...", nativeQuery=true)
Also, make sure you've formatted it correctly for Java in terms of spaces, quotes etc.
If you want to use parameters, use positional instead of named parameters.
For example (a bit silly):
@Query(value="select * from emp where name=?1 and dept=?2", nativeQuery=true)
public Collection<Employee> findEmployeesByNameAndDept(String name, String dept);
Adding such a complex query to Java code using JPA seems like a poor idea though. Maybe you should use a stored procedure or function or somesuch.
Upvotes: 8