我正在尝试在我的JPA import.sql
文件中定义一些PostgreSQL函数和触发器。我使用Hibernate
5.x作为基础JPA提供程序。由于我的import.sql
文件包含多行命令,因此我在persistence.xml
文件中设置了以下属性:
<property name="hibernate.hbm2ddl.import_files_sql_extractor" value="org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor" />
从那里,我试图在中定义函数import.sql
。他们看起来像这样:
DROP FUNCTION IF EXISTS update_total_feedback_count() CASCADE;
CREATE FUNCTION update_total_feedback_count() RETURNS TRIGGER AS
$$
DECLARE
application_version_id BIGINT := 0;
app_version_metadata_id BIGINT:= 0;
application_id BIGINT := 0;
app_metadata_id BIGINT := 0;
BEGIN
IF (TG_OP = 'INSERT') THEN
SELECT INTO application_version_id tbl_application_version.id
FROM tbl_application_version
INNER JOIN tbl_feedback ON tbl_feedback.application_version_id = tbl_application_version.id
WHERE tbl_feedback.id = NEW.id;
SELECT INTO app_version_metadata_id tbl_application_version.application_version_metadata_id
FROM tbl_application_version
WHERE id = application_version_id;
SELECT INTO app_metadata_id registered_application_metadata_id
FROM tbl_registered_application
INNER JOIN tbl_application_version ON tbl_application_version.registered_application_id = tbl_registered_application.id
WHERE tbl_application_version.id = application_version_id;
UPDATE tbl_registered_application_metadata SET feedbackcount = (feedbackcount + 1), lastfeedbackdate = NEW.createddate WHERE id = app_metadata_id;
UPDATE tbl_application_version_metadata SET feedbackcount = (feedbackcount + 1), lastfeedbackdate = NEW.createddate WHERE id = app_version_metadata_id;
RETURN NEW;
ELSIF (TG_OP = 'DELETE') THEN
-- IMPLEMENT THIS TRIGGER
RETURN NULL;
END IF;
END;
$$
LANGUAGE 'plpgsql';
ALTER FUNCTION update_total_feedback_count() OWNER TO feedback_tracker;
但是,当我部署WAR文件时,出现如下错误:
无终止的美元报价从SQL中的位置65开始创建函数my_function()以T的形式返回触发器
因此,很明显,它依赖$$
于我的函数声明中。有没有解决的办法?我应该以不同的方式声明我的功能/触发吗?我可以在persistence.xml
文件中设置可以解决此问题的属性吗?
hibernate的默认SqlStatementParser实现的问题,该实现在多行sql命令提取器中使用。
如果查看语法定义hibernate-core/src/main/antlr/sql-stmt.g
,则有语句结尾的定义:
STMT_END
: ';' ( '\t' | ' ' | '\r' | '\n' )*
;
NOT_STMT_END
: ~( ';' )
;
这表明语句结尾是分号符号,后跟“空格”,“制表符”,“回车符”或“换行”符号。
因此:在Hibernate中的默认实施不支持美元报价。
如果您不想实现自定义的hibernate解析器,则可以使用简单的'
引用重写所有函数而无需使用美元引用。但是您将需要小心逃脱'
字符。
更新:您可以创建自定义
ImportSqlCommandExtractor
。例如:使用以下命令分隔命令--******
(在注释中使用6个星号,只是为了使您的文件成为正确的SQL文件,而在注释中使用自定义命令分隔,或者选择您喜欢的任何疯狂组合),然后在简单实现中将它们分开
public class ImportSqlCE implements ImportSqlCommandExtractor {
private static final Logger log = LoggerFactory.getLogger(ImportSqlCE.class);
@Override
public String[] extractCommands(Reader reader) {
try {
String allCommands = IOUtils.toString(reader);
return allCommands.split("--******");
} catch (IOException e) {
log.error("error reading import commands", e);
log.info("sengind default empty command set");
return new String[0];
}
}
}
然后配置hibernate以使用它 <property name="hibernate.hbm2ddl.import_files_sql_extractor" value="example.ImportSqlCE" />
有了这个,您的import.sql将支持美元报价(即它将简单地忽略任何SQL对正在发生的事情的了解。)
问题内容: 例如,我有一个文件,它是一个对象数组(严格地形成),它很简单(没有嵌套的对象),就像这样(重要的是:它已经包含了id): 我想将它们全部导入到表的postgres db中。 当我将其作为json类型的列导入到像这样的表中并用其中列出的对象命名的列,然后使用sql获取这些值并将其插入到真实表中时,我发现了一些非常困难的方法。 但是有没有一种简单的方法就可以将json导入到postgres
问题内容: 我有一个如下文件: 我正在尝试将其导入文件。为此,我将其添加到类型定义中: 我正在这样导入。 在文件中,我将颜色用作。但是我得到一个错误: 属性’primaryMain’在类型’typeof“ * .json”上不存在 问题答案: 导入表单和模块声明需要就模块的形状,导出的内容达成一致。 编写时(自TypeScript 2.9导入JSON时,针对兼容模块格式的一种次佳实践, 请参见no
问题内容: 我是React的新手,正在尝试从外部文件导入JSON 变量。我收到以下错误: 找不到模块“ ./customData.json” 有人可以帮我吗?如果我的变量位于外部JSON文件中,但没有该变量,则它可以工作。 index.js hobbies.js profile.js customData.json 问题答案: 一种不错的方法(不添加伪造的.js扩展名,用于代码而不用于数据和配置)
我尝试使用Neo4j工具和导入csv文件。 我有个问题。我的csv文件是清晰的,但是,在neo4j浏览器。
然后我试着用斜线。
问题内容: 我正在尝试在React组件中加载language.json文件。当我想导入json文件时,第一步出现以下错误。这是错误: 我正在使用webpack,这是配置文件: 并且我已经安装了以下软件包: 这就是我尝试导入文件(ES6格式)的方式: 另外,我检查了json文件格式并进行了验证!那么,您认为问题出在哪里? 问题答案: azium是正确的,需要加载程序,但这是很好的配置: npm命令