通过调用Java方法为H2数据库中的新行生成默认值 [英] Generate default values for new rows in H2 database by calling a Java method
问题描述
生成测试数据时,我希望新行中的字段默认为 lorem ,这是Java的 Lorem Ipsum 生成器.>
在Java中调用lorem工具如下:
String lorem = LoremIpsum.getInstance().getWords( 100 , 120 );
我尝试使用此SQL作为表定义:
String sql =
"""
CREATE ALIAS LOREM FOR "com.thedeanda.lorem.LoremIpsum.getInstance().getWords( 100 , 120 )";
CREATE TABLE IF NOT EXISTS thing_
(
nonsense_ text NOT NULL ,
row_created_ TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP() ,
id_ uuid NOT NULL DEFAULT RANDOM_UUID() ,
CONSTRAINT thing_pkey_ PRIMARY KEY ( id_ )
)
;
""";
但是抛出:
org.h2.jdbc.JdbcSQLSyntaxErrorException:找不到公共静态Java方法:"getInstance().getWords(100,120)(com.thedeanda.lorem.LoremIpsum)"; SQL语句:
为"com.thedeanda.lorem.LoremIpsum.getInstance().getWords(100,120)"创建别名. [90139-200]
是否有某种方法可以包装对Java方法的调用以用作H2的SQL中的函数?
我认为您不能包含参数,也不能调用实例方法.您需要制作一个静态方法:
public class Whatever {
public static String generateLorem() {
return LoremIpsum.getInstance().getWords(100, 120);
}
}
然后
CREATE ALIAS LOREM FOR "com.foo.Whatever.generateLorem";
When generating test data, I want a field in new rows to default to a value of gibberish generated by lorem, a Lorem Ipsum generator for Java.
Calling the lorem tool in Java looks like this:
String lorem = LoremIpsum.getInstance().getWords( 100 , 120 );
I tried this SQL as my table definition:
String sql =
"""
CREATE ALIAS LOREM FOR "com.thedeanda.lorem.LoremIpsum.getInstance().getWords( 100 , 120 )";
CREATE TABLE IF NOT EXISTS thing_
(
nonsense_ text NOT NULL ,
row_created_ TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP() ,
id_ uuid NOT NULL DEFAULT RANDOM_UUID() ,
CONSTRAINT thing_pkey_ PRIMARY KEY ( id_ )
)
;
""";
But that throws:
org.h2.jdbc.JdbcSQLSyntaxErrorException: The public static Java method was not found: "getInstance().getWords(100,120) (com.thedeanda.lorem.LoremIpsum)"; SQL statement:
CREATE ALIAS LOREM FOR "com.thedeanda.lorem.LoremIpsum.getInstance().getWords( 100 , 120 )"; [90139-200]
Is there some way to wrap a call to a Java method to be used as a function within SQL for H2?
I don't think you can include the parameters, and you can't invoke an instance method. You need to make a single static method:
public class Whatever {
public static String generateLorem() {
return LoremIpsum.getInstance().getWords(100, 120);
}
}
and then
CREATE ALIAS LOREM FOR "com.foo.Whatever.generateLorem";
这篇关于通过调用Java方法为H2数据库中的新行生成默认值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!