当前位置:   article > 正文

PostgreSQL JPA使用总结(持续更新)_jpa postgresql

jpa postgresql

1. 如何一次获得sequence的多个值

select nextval('schemaName.sequenceName') as id from generate_series(starter: Integer, stop: Integer)
  • 1

其中generate_series为一个函数用于获取带序数的行,返回的行数为stop-starter+1

2. 使用currval无法获得序列的当前值

使用如下代码获得序列的当前值

select currval('schemaName.sequenceName);
  • 1

会提示
“currval of sequence “centrelink_request_batch_number” is not yet defined in this session”
这是因为当前序列还没有使用过,缓存中无值,如果使用nextval获得过一次序列的值,就可以使用currval获得序列的当前值了

3. varchar、varchar2和char

  • char类型的长度是固定的,varchar的长度是可变的
  • char类型的效率比varchar的效率稍高
  • varchar2是oracle开发的一个数据类型。
  • 工业标准的varchar可以存储空字符串,oracle的varchar2还可以存储NULL值,如果想要有向后兼容的能力建议使用varchar2
  • varchar2比char节省空间,但是在效率上比char稍差些,即以"以空间换时间"
  • 若varchar2列经常被修改,而且每次修改的数据长度不同,这会引起“行迁移的现象”,从而造成的多余的I/O,是数据库设计中尽量避免的,在这种情况下使用char代替varchar2会更好些。

4. money类型

货币类型,存储具有固定精度的货币数量,如下表所示。小数精度由数据库的lc_money设置决定。表中所示的范围假设有两个小数。输入可以接受多种格式,包括整数和浮点文本,以及典型的货币格式,如’$1,000.00’。输出通常是后一种形式,但取决于地区。
在这里插入图片描述
由于这种数据类型的输出对local敏感,因此将货币数据加载到具有不同lc_money设置的数据库中可能无法工作。为了避免出现问题,在将其储存到新数据库之前,请确保lc_monetary的值与转储的数据库中的值相同或相等。

numeric、int和bigint数据类型的值可以转换为money。从实数和双精度数据类型转换可以通过先转换为数值类型来实现,例如:

SELECT '12.34'::float8::numeric::money;
  • 1

但是,不建议这样做。浮点数不应该用于处理货币,因为可能会出现舍入错误。money值可以转换为numeric而不丢失精度。但如果转换为其他类型可能会丢失精度,面且必须分两个阶段完成:

SELECT '52093.89'::money::numeric::float8;
  • 1

当一个货币值除以另一个货币值时,结果是double类型(即,一个纯粹的数字,而不是money类型),在除法中,货币单位相互抵消。

5. JPA中使用limit

JPA的@Query注解中,如果不加nativeQuery=true,则写的SQL是JPQL,而JPQL是不支持limit的,如果加入nativeQuery=true,则写的SQL是原生SQL,而原生SQL是支持limit的,因此,如果要使用limit,则需要在@Query中加入nativeQuery=true

6. Hibernater由于外键设置不为空,导致在主键级联删除时失败

媒体表
@Entity
public class Media implements Serializable {
    ......略
    @OneToMany(cascade=CascadeType.REMOVE)
    @JoinColumn(name = "FK_Media_id",updatable=false) //FK_Media_id为MediaComment表中的外键
    private Set<MediaComment> mediaCommetnSet; // 媒体评论表
 
}
媒体评论表
@Entity
public class MediaComment implements Serializable {
    ......略
    @ManyToOne
    @JoinColumn(name = "FK_Media_id")
    private Media media;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在updatable=false不添加时,会发现删除媒体表时,会发生更新语句FK_Media_id不能为NULL的错误提示,添加updatable=false即可解决该问题。
参考:https://blog.csdn.net/zbzhangzi/article/details/84827895

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/173722?site
推荐阅读
相关标签
  

闽ICP备14008679号