【问题标题】:How to port postgresql time zone statement in Jpa criteria如何在 Jpa 标准中移植 postgresql 时区语句
【发布时间】:2021-10-15 02:06:06
【问题描述】:

JPA/Hibernate 标准的新手,我正在使用 Postgresql。我必须翻译这样的东西:

SELECT * from mytable m where m.mytimestamptzcolum at time zone m.mytimezonecolumn < ?;

在 JPA 标准中,但在与CriteriaBuilder 和自定义函数搞砸了一整天之后,我还没有找到解决方案。 Hibernate 有很好的org.hibernate.criterion.Restrictions#sqlRestriction,但我不得不留在 JPA。有什么建议吗?

【问题讨论】:

    标签: java postgresql hibernate jpa criteria-api


    【解决方案1】:

    在第四次阅读 Vlad Mihalcea great post 之后,我意识到如何使用 JPA 的标准构建器实现相同的结果:

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<MyTable> query = cb.createQuery(MyTable.class);
    Root<MyTable> root = query.from(MyTable.class);
    
    Predicate exp = cb.lessThan(cb.function("get_time_at_zone", Timestamp.class,
      root.get(MyTableMetamodel_.since).get(MyEmbeddedLocalDateTime_.instant),
      root.get(MyTableMetamodel_.since).get(MyEmbeddedLocalDateTime_.zoneId)),
      Timestamp.valueOf(time));
    

    以上代码依赖于我添加的这个自定义函数:

    CREATE FUNCTION get_time_at_zone(timetoconvert timestamptz, zoneid character varying) RETURNS timestamp AS
      'select $1 at time zone $2;'
    language sql;
    

    我通过使用以下类公开休眠:

    public class FunctionCastToSpecificTimezone implements MetadataBuilderContributor {
    
    @Override
    public void contribute(MetadataBuilder metadataBuilder) {
        metadataBuilder.applySqlFunction(
                "get_time_at_zone",
                new StandardSQLFunction(
                        "get_time_at_zone",
                        StandardBasicTypes.TIMESTAMP));
        }
    }
    

    并注册到persistence.xml

    <persistence-unit name="puname">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        ...
        <properties>
            ...
            <property name="hibernate.metadata_builder_contributor"
                value="my.dummy.sql.utils.FunctionCastToSpecificTimezone" />
        </properties>
    </persistence-unit>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      相关资源
      最近更新 更多