Hibernate查询最终出现SQL语法错误

时间:2018-09-02 15:18:07

标签: java mysql hibernate spring-data-jpa

我创建了一个do { promptUser(square); printBoard(square); }while(!fullBoard(square)); if(isLatinSquare(square)) { System.out.println("you win"); } else { System.out.println("you lose"); } printBoard(square); bean。主键为Sub category_sums() Set ws = ActiveWorkbook.Sheets("Test") ws.Activate Set MyRg1 = ws.Range("$A$2:$A$582") Set MyRg2 = ws.Range("$H$2:$H$58") ws.Range("J17").Formula = "=SumIf((MyRg1,""Auto/Transportation"", MyRg2)" End Sub 列。这是bean的定义:

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不是val newUserPreferences = UserPreferences().apply { email = newUserRequest.email } mUserPreferenceService.save(newUserPreferences) 。我的newUserRequest.email中的null设置是auto-dll。执行此代码后,我看到application.yml生成以下查询以创建表:

update

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

  

产生原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:   您的SQL语法有误;检查手册   对应于您的MariaDB服务器版本,以使用正确的语法   靠近“不为空”

看着异常,很明显代码失败了,因为休眠不是使用空的Hibernate作为默认值,而是在生成的查询中简单地留了一个空格。所以这是我的问题:

  1. 应该在Hibernate中将其视为错误吗?
  2. 如何处理我想将空字符串create table user_preferences ( id varchar(255) default not null email varchar(255), primary key (id) ) engine=MyISAM 作为列默认值的情况?

1 个答案:

答案 0 :(得分:2)

我不是Hibernate用户,但我发现https://github.com/hibernate/hibernate-orm/blob/master/documentation/src/test/java/org/hibernate/userguide/schema/ColumnDefaultTest.java显示:

@ColumnDefault("'N/A'")

看来,当您为SQL字符串类型定义默认值时,必须在Java字符串内使用SQL字符串定界符(单引号)。对于您的情况,由于您需要一个空字符串,因此可以使用:

@ColumnDefault("''")

定义默认值的另一种方法是在@Column批注中设置属性,如另一个Stack Overflow答案:How to set default value in Hibernate

所示。

所以这可能不是bug,但这是Hibernate的用法,对某些用户而言是违反直觉的,并且可能没有明确记录。

P.S .:我将其视为一个错误,即Hibernate仍会使用engine=MyISAM unless you specify the right hibernate.dialect生成CREATE TABLE语句。不建议使用该存储引擎。在大多数情况下,MyISAM比InnoDB慢,并且不支持任何ACID属性。 MySQL已经淘汰了MyISAM,我不建议在任何当前项目中使用它。