Hibernate查询以SQL语法错误结束

问题描述 投票:3回答:1

我创造了一个UserPreferences豆。主键是id列。这是bean的定义:

@Entity
public class UserPreferences {

    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    @Column(unique = true)
    @ColumnDefault("")
    private String id;

    private String email;

    // Getters and Setters
}

现在我使用Kotlin在这个bean中插入数据。这是执行此操作的代码:

val newUserPreferences = UserPreferences().apply { email = newUserRequest.email }
mUserPreferenceService.save(newUserPreferences)

让我们假设qazxsw poi不是qazxsw poi。我的newUserRequest.email中的qazxsw poi设置是null。执行此代码时,我看到auto-dll生成以下查询以创建表:

application.yml

此时,应用程序无法加载,并出现以下错误:

引发者:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法中有错误;检查与您的MariaDB服务器版本对应的手册,以便在'not null附近使用正确的语法,

看一下异常,很明显代码失败了,因为hibernate只是在生成的查询中放入一个空格而不是使用空的update作为默认值。所以这是我的问题:

  1. 这应该被视为Hibernate中的错误吗?
  2. 如何处理这种情况我希望有一个空的字符串Hibernate作为列默认值?
java mysql hibernate spring-data-jpa
1个回答
2
投票

我不是Hibernate用户,但我发现create table user_preferences ( id varchar(255) default not null email varchar(255), primary key (id) ) engine=MyISAM 显示:

String

看来,当您为SQL字符串类型定义默认值时,必须在Java字符串中使用SQL字符串分隔符(单引号)。在你的情况下,因为你想要一个空字符串,你可以使用:

""

定义默认值的另一种方法是在https://github.com/hibernate/hibernate-orm/blob/master/documentation/src/test/java/org/hibernate/userguide/schema/ColumnDefaultTest.java注释中设置属性,如另一个Stack Overflow答案所示:@ColumnDefault("'N/A'")

所以这可能不是一个错误,但它是Hibernate的一种用法,对某些用户来说是违反直觉的,也许没有明确记录。

P.S。:我认为这是一个错误,Hibernate仍然使用@ColumnDefault("''") @Column生成CREATE TABLE语句。不建议使用该存储引擎。在大多数情况下,MyISAM比InnoDB慢,并且不支持任何ACID属性。 MySQL已逐步淘汰MyISAM,我不建议将其用于任何当前项目。

© www.soinside.com 2019 - 2024. All rights reserved.