将时间间隔添加到时间戳。在 Repository 接口中生成 @Query
Adding interval to timestamp. Producing @Query in Repository interface
数据库:Postgres,
编程技术:SpringBoot(Java11)
我正在尝试创建 @Query 但我实现它的方式 Hibernate 不会生成它,我得到的异常是间隔函数。
我想根据 UserProps 在 modifiedAt 列中添加一些天数,然后决定 Db 是否应该 select 它。我调用了 Postgres INTERVAL 内部函数,但它似乎不起作用
@Query ("select a job from Job job, Project proj, User u, Userprops props, where job.status LIKE 'CANCELED' AND job.project = proj.id AND \ n" +
"proj.user = u.id AND props.user = u.id AND NOW () <job.modifiedAt + props.removeThingsAfterDays * FUNCTION ('INTERVAL' '1 day')")
List <XTMJobEntity> getAllJobsThatShouldBeDeletedFromDbBasedOnUserProps ();
在 Postgres 中 interval 不是函数,而是数据类型。即使它是一个 though,您仍然不会使用 FUNCTION 作为关键字。在 Postgres 中,查询将是(保留过时的连接语法):
select a job
from job job
, project proj
, user u
, userprops props
where job.status = 'CANCELED'
and job.project = proj.id
and proj.user = u.id
and props.user = u.id
and now () <job.modifiedat + props.removethingsafterdays * '1 day'::interval;
---- OR
select a job
from job
, project proj
, user u
, userprops props
where job.status = 'CANCELED'
and job.project = proj.id
and proj.user = u.id
and props.user = u.id
and now () <job.modifiedat + props.removethingsafterdays * interval '1 day';
注意:SQL 语句中不带通配符(% 或 _)的 LIKE 等同于等于运算符 (=)。
所以也许你的查询字符串变成:
@Query ("select a job from Job job, Project proj, User u, Userprops props, where job.status LIKE 'CANCELED' AND job.project = proj.id AND \ n" +
"proj.user = u.id AND props.user = u.id AND NOW () <job.modifiedAt + props.removeThingsAfterDays * INTERVAL '1 day'")
我的问题的答案如下:
@Query(value = "select job.* " +
"from jobs job INNER JOIN projects proj ON job.project_id = proj.id INNER JOIN users u ON proj.user_id = u.id " +
"INNER JOIN user_properties props ON props.user_id = u.id " +
"where job.status = 'CANCELLED' " +
"AND NOW() < job.modified_at + props.remove_cancelled_jobs_days * Interval '1days';", nativeQuery = true)
数据库:Postgres, 编程技术:SpringBoot(Java11)
我正在尝试创建 @Query 但我实现它的方式 Hibernate 不会生成它,我得到的异常是间隔函数。 我想根据 UserProps 在 modifiedAt 列中添加一些天数,然后决定 Db 是否应该 select 它。我调用了 Postgres INTERVAL 内部函数,但它似乎不起作用
@Query ("select a job from Job job, Project proj, User u, Userprops props, where job.status LIKE 'CANCELED' AND job.project = proj.id AND \ n" +
"proj.user = u.id AND props.user = u.id AND NOW () <job.modifiedAt + props.removeThingsAfterDays * FUNCTION ('INTERVAL' '1 day')")
List <XTMJobEntity> getAllJobsThatShouldBeDeletedFromDbBasedOnUserProps ();
在 Postgres 中 interval 不是函数,而是数据类型。即使它是一个 though,您仍然不会使用 FUNCTION 作为关键字。在 Postgres 中,查询将是(保留过时的连接语法):
select a job
from job job
, project proj
, user u
, userprops props
where job.status = 'CANCELED'
and job.project = proj.id
and proj.user = u.id
and props.user = u.id
and now () <job.modifiedat + props.removethingsafterdays * '1 day'::interval;
---- OR
select a job
from job
, project proj
, user u
, userprops props
where job.status = 'CANCELED'
and job.project = proj.id
and proj.user = u.id
and props.user = u.id
and now () <job.modifiedat + props.removethingsafterdays * interval '1 day';
注意:SQL 语句中不带通配符(% 或 _)的 LIKE 等同于等于运算符 (=)。
所以也许你的查询字符串变成:
@Query ("select a job from Job job, Project proj, User u, Userprops props, where job.status LIKE 'CANCELED' AND job.project = proj.id AND \ n" +
"proj.user = u.id AND props.user = u.id AND NOW () <job.modifiedAt + props.removeThingsAfterDays * INTERVAL '1 day'")
我的问题的答案如下:
@Query(value = "select job.* " +
"from jobs job INNER JOIN projects proj ON job.project_id = proj.id INNER JOIN users u ON proj.user_id = u.id " +
"INNER JOIN user_properties props ON props.user_id = u.id " +
"where job.status = 'CANCELLED' " +
"AND NOW() < job.modified_at + props.remove_cancelled_jobs_days * Interval '1days';", nativeQuery = true)