Java 带JPA/Hibernate和PostgreSQL的Spring(启动)-对日期使用重叠

Java 带JPA/Hibernate和PostgreSQL的Spring(启动)-对日期使用重叠,java,postgresql,hibernate,postgis,hibernate-spatial,Java,Postgresql,Hibernate,Postgis,Hibernate Spatial,所以我有一个项目,我们使用springBoot和PostgreSQL 10以及PostGis和hibernate.spatial进行空间查询。到目前为止一切正常 一个新的要求是查找实体,这些实体的开始-结束日期以任何可能的方式与查询的开始-结束日期重叠(范围可能是封闭的、开始-重叠的、中间的、结束-重叠的) 在PostgreSQL中,操作员似乎非常适合这项工作 当我试图在JPA查询中使用它来查询这样的实体“某物”时 select sth from Sth sth where 1=1 and (s

所以我有一个项目,我们使用springBoot和PostgreSQL 10以及PostGis和hibernate.spatial进行空间查询。到目前为止一切正常

一个新的要求是查找实体,这些实体的开始-结束日期以任何可能的方式与查询的开始-结束日期重叠(范围可能是封闭的、开始-重叠的、中间的、结束-重叠的)

在PostgreSQL中,操作员似乎非常适合这项工作

当我试图在JPA查询中使用它来查询这样的实体“某物”时

select sth from Sth sth where 1=1 and (sth.start, sth.end) overlaps (:begin, :end)
// set begin and end params..
我得到一个

antlr.NoViableAltException: unexpected token: overlaps

antlr.NoViableAltException: unexpected AST node: (

org.postgresql.util.PSQLException: FEHLER: rt_raster_from_wkb: wkb size (5)  < min size (61)
antlr.noviablealException:意外标记:重叠
antlr.NoViableAltException:意外的AST节点:(
org.postgresql.util.psqleexception:FEHLER:rt_光栅_from_wkb:wkb大小(5)<最小大小(61)

是否可以在不编写本机查询的情况下使用JPA的日期重叠?

因此,似乎需要做三件事才能使其正常工作

  • 可能无法将重叠用作运算符,但幸运的是,它似乎也可以用作函数:
    overlaps(start1,end1,start2,end2)

  • 重叠不是由任何hibernate核心PostgreSQL[NN]方言映射的。但它是由hibernate spatial PostgisPG[NN]方言映射的,它映射到st_Overlaps函数以进行空间重叠。因此,您需要使用自己的自定义方言,将重叠函数注册为别名,如下所示:



  • 并将其指定为您的
    spring.jpa.properties.hibernate.dialogue
    (或
    spring.jpa.database platform
    ),因此,您需要做三件事才能使其正常工作

  • 可能无法将重叠用作运算符,但幸运的是,它似乎也可以用作函数:
    overlaps(start1,end1,start2,end2)

  • 重叠不是由任何hibernate核心PostgreSQL[NN]方言映射的。但它是由hibernate spatial PostgisPG[NN]方言映射的,它映射到st_Overlaps函数以进行空间重叠。因此,您需要使用自己的自定义方言,将重叠函数注册为别名,如下所示:


  • 并将其指定为您的
    spring.jpa.properties.hibernate.dial
    (或
    spring.jpa.database platform
    public class PostgisDialect extends org.hibernate.spatial.dialect.postgis.PostgisPG95Dialect {
    
        public PostgisDialect() {
            super();
            registerFunction("dateoverlaps", new StandardSQLFunction("overlaps", StandardBasicTypes.BOOLEAN));
        }
    
    }