播放框架 - Mysql 保存模型时出错
Play framework - Mysql error on save model
我创建的模型如下:
@Entity
@Table(name ="news_items")
public class NewsItem extends Model {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
public long id;
public String url;
public long friend_id;
public int count_for_the_day;
public String friend_name;
public String friend_img;
public Date friend_posted_at;
public String friend_text;
@Formats.DateTime(pattern="yyyy-MM-dd HH:mm:ss.SSS")
public Date current_time = new Date();
}
我正在尝试通过以下方式将其保存在控制器中:
NewsItem _newsItem = new NewsItem();
_newsItem.url = shared_url;
_newsItem.friend_name = status.getUser().getName();
_newsItem.friend_img = status.getUser().getProfileImageURL();
_newsItem.friend_id = status.getUser().getId();
_newsItem.friend_text = status.getText();
_newsItem.friend_posted_at = status.getCreatedAt();
_newsItem.count_for_the_day = 1;
_newsItem.save();
resultItems.add(_newsItem);
None 个值是 null
。我在激活器控制台中收到错误消息:
Caused by: javax.persistence.PersistenceException: ERROR executing DML bindLog[]
error[You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near 'current_time) values
('http://www.lahamag.com/Details/42019/119/%D8%B3%D8%B9%D9%' at line 1]
与 mysql 数据库中的变量相关的部分 table 结构如下所示:
| friend_text | varchar(255) | YES | | NULL | |
| current_time | datetime | YES | | NULL | |
+-------------------+--------------+------+-----+---------+----------------+
我有以下问题:
- 我没有执行任何查询。我想 Play 内部会这样做。我如何查看完整查询,其中包含执行时执行的内容的值
save()
?
- 如何解决?
显然 current_time
是 MySQL 中的保留字,应该被引用,TBH 我不知道如何在 Ebean 中强制使用这些引号,所以最快的解决方案是将字段重命名为一些非保留字像 publishDate
.
顺便说一句,如您所见,您可以在模型中为字段使用 camelCase 名称,Ebean 通过将查询更改为 [=20= 来正确处理它们]
How I can see full query with values of what is being executed?
在application.conf中添加
db.default.logStatements=true
在 conf 文件夹中创建文件 logger.xml,内容为
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-5level - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.jolbox.bonecp" level="DEBUG">
<appender-ref ref="STDOUT" />
</logger>
<logger name="play" level="DEBUG">
<appender-ref ref="STDOUT" />
</logger>
<logger name="application" level="DEBUG">
<appender-ref ref="STDOUT" />
</logger>
这将显示在控制台中生成的 sql。
Source
How to solve this?
错误是因为current_time是mysql中的保留字。
解决方案
@Column(name="`current_time`") //backticks
public Date current_time = new Date();
它会成功的。
我创建的模型如下:
@Entity
@Table(name ="news_items")
public class NewsItem extends Model {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
public long id;
public String url;
public long friend_id;
public int count_for_the_day;
public String friend_name;
public String friend_img;
public Date friend_posted_at;
public String friend_text;
@Formats.DateTime(pattern="yyyy-MM-dd HH:mm:ss.SSS")
public Date current_time = new Date();
}
我正在尝试通过以下方式将其保存在控制器中:
NewsItem _newsItem = new NewsItem();
_newsItem.url = shared_url;
_newsItem.friend_name = status.getUser().getName();
_newsItem.friend_img = status.getUser().getProfileImageURL();
_newsItem.friend_id = status.getUser().getId();
_newsItem.friend_text = status.getText();
_newsItem.friend_posted_at = status.getCreatedAt();
_newsItem.count_for_the_day = 1;
_newsItem.save();
resultItems.add(_newsItem);
None 个值是 null
。我在激活器控制台中收到错误消息:
Caused by: javax.persistence.PersistenceException: ERROR executing DML bindLog[]
error[You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near 'current_time) values
('http://www.lahamag.com/Details/42019/119/%D8%B3%D8%B9%D9%' at line 1]
与 mysql 数据库中的变量相关的部分 table 结构如下所示:
| friend_text | varchar(255) | YES | | NULL | |
| current_time | datetime | YES | | NULL | |
+-------------------+--------------+------+-----+---------+----------------+
我有以下问题:
- 我没有执行任何查询。我想 Play 内部会这样做。我如何查看完整查询,其中包含执行时执行的内容的值
save()
? - 如何解决?
显然 current_time
是 MySQL 中的保留字,应该被引用,TBH 我不知道如何在 Ebean 中强制使用这些引号,所以最快的解决方案是将字段重命名为一些非保留字像 publishDate
.
顺便说一句,如您所见,您可以在模型中为字段使用 camelCase 名称,Ebean 通过将查询更改为 [=20= 来正确处理它们]
How I can see full query with values of what is being executed?
在application.conf中添加
db.default.logStatements=true
在 conf 文件夹中创建文件 logger.xml,内容为
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%-5level - %msg%n</pattern> </encoder> </appender> <logger name="com.jolbox.bonecp" level="DEBUG"> <appender-ref ref="STDOUT" /> </logger> <logger name="play" level="DEBUG"> <appender-ref ref="STDOUT" /> </logger> <logger name="application" level="DEBUG"> <appender-ref ref="STDOUT" /> </logger>
这将显示在控制台中生成的 sql。
Source
How to solve this?
错误是因为current_time是mysql中的保留字。
解决方案
@Column(name="`current_time`") //backticks
public Date current_time = new Date();
它会成功的。