gpt4 book ai didi

java - 数据库函数与其他列的Hibernate/JPA属性映射结果

转载 作者:行者123 更新时间:2023-12-02 02:11:35 29 4
gpt4 key购买 nike

我遇到一种情况,我使用 Hibernate (5.2.16) 来映射表,并且其中一个列值是通过数据库函数构造的,该函数采用其他两个属性的值。

对于某些背景来说,这是一个带有 ST_GEOMETRY 列的 SDE 空间表。据我所知,这与 Hibernate 支持的两种类型的空间 API 不兼容,但即使兼容,我也没有进行任何空间操作,所以我并不真正需要它们,我只是想要插入和更新几何列。

我完全无法控制表格的结构,因为它是由另一个小组使用另一个工具 (GIS) 指定的。

我尝试过的事情:

  1. 使用 Hibernate UserType。这样做的问题是,我只看到一种使用 PreparedStatement 获取和设置值的方法,而无法指示实际使用的 SQL。 basic-custom-type
  2. 使用 Hibernate ColumnTransformer。这使我可以直接控制所使用的 SQL,但我无法使用 SQL 中其他两个属性的值。 mapping-column-read-and-write

    @Column(name="LATITUDE")
    private BigDecimal latitude;
    @Column(name="LONGITUDE")
    private BigDecimal longitude;

    @ColumnTransformer(
    read="sde.st_astext(shape)",
    write="sde.st_transform(sde.st_point(LONGITUDE,LATITUDE, 4326), 3857)"
    )
    @Generated(value=GenerationTime.ALWAYS)
    @Column(name="SHAPE")
    private String shape;

    我得到:

    org.hibernate.AnnotationException: @WriteExpression must contain exactly one value placeholder ('?') character: property [shape] and column [SHAPE]

  3. 我查看了生成的列,但这些列是由数据库生成的值。 mapping-generated

  4. 我查看了 Formula 列,但这些列用于在 Java 中计算和使用的值,但未插入或更新。 mapping-column-formula

    @Formula(value="sde.st_astext(shape)")
    private String shape;

    它对某些事情很有用,但我无法插入或更新它。

我希望我错过了一些东西。此时我正在考虑非 Hibernate/JPA 解决方案。使用原始 SQL 和 JDBC,这将相对容易,但表的其余部分会很烦人,并且与我的代码的其余部分不匹配。我还必须自己进行脏检查之类的事情。

最佳答案

您可以使用 hibernate database generated value 。它允许您调用数据库函数来生成实体属性。

关于java - 数据库函数与其他列的Hibernate/JPA属性映射结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49930098/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com