通过调用Java方法为H2数据库中的新行生成默认值 [英] Generate default values for new rows in H2 database by calling a Java method

查看:90
本文介绍了通过调用Java方法为H2数据库中的新行生成默认值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

生成测试数据时,我希望新行中的字段默认为 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆