bugfix> java > 投稿

テストデータを生成するとき、新しい行のフィールドをデフォルトで次のように生成された意味不明の値にします。lorem、Lorem Ipsum Java用のジェネレータ。

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: 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]

SQL for H2内の関数として使用されるJavaメソッドの呼び出しをラップする方法はありますか?

回答 2 件
  • パラメータを含めることはできないと思います。また、インスタンスメソッドを呼び出すこともできません。単一の静的メソッドを作成する必要があります。

    public class Whatever {
        public static String generateLorem() {
            return LoremIpsum.getInstance().getWords(100, 120);
        }
    }
    
    

    その後

    CREATE ALIAS LOREM FOR "com.foo.Whatever.generateLorem";
    
    

  • rzwitserlootによる回答は正しいです。

    さらに、これはその回答に見られるアプローチを示す完全なサンプルアプリです。

    このコードを実行するには、の呼び出しでファイルパス引数を置き換えます ds.setURL データベースファイルに名前を付けて、好みに合わせて配置します。次に、を実行します main 方法。

    package work.basil.example;
    import com.thedeanda.lorem.LoremIpsum;
    import org.h2.jdbcx.JdbcDataSource;
    import javax.sql.DataSource;
    import java.sql.*;
    import java.time.*;
    import java.util.Objects;
    import java.util.UUID;
    public class FiftyMillion
    {
        DataSource dataSource;
    
        public static String generateLorem ( )
        {
            return LoremIpsum.getInstance().getWords( 100 , 120 );
        }
    
        public static void main ( String[] args )
        {
            FiftyMillion app = new FiftyMillion();
            app.prepareDatabase();
            app.makeRow();
            app.dumpRows();
    //        app.populateDatabase();
    //        app.exportDatabaseToCsv();
        }
        // Constructor
        public FiftyMillion ( )
        {
            // DataSource
            org.h2.jdbcx.JdbcDataSource ds = Objects.requireNonNull( new JdbcDataSource() );  // Implementation of `DataSource` bundled with H2.
            ds.setURL( "jdbc:h2:/Volumes/blue_disc/fifty_million;" );
            ds.setUser( "scott" );
            ds.setPassword( "tiger" );
            ds.setDescription( "An example database showing ResultSet access to 50 million records." );
            this.dataSource = ds;
        }
        private void prepareDatabase ( )
        {
            String lorem = LoremIpsum.getInstance().getWords( 100 , 120 );
            String sql =
                    """
                    CREATE ALIAS IF NOT EXISTS LOREM FOR "work.basil.example.FiftyMillion.generateLorem" ;
                    CREATE TABLE IF NOT EXISTS thing_
                    (
                        nonsense_ text NOT NULL DEFAULT LOREM() ,
                        row_created_ TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP() ,
                        id_ uuid NOT NULL DEFAULT RANDOM_UUID() ,
                        CONSTRAINT thing_pkey_ PRIMARY KEY ( id_ )
                    )
                    ;
                    """;
            try (
                    Connection conn = dataSource.getConnection() ;
                    Statement stmt = conn.createStatement() ;
            )
            {
                System.out.println( "INFO - Running `prepareDatabase` method." );
                stmt.executeUpdate( sql );
            }
            catch ( SQLException e )
            {
                e.printStackTrace();
            }
        }
        private void makeRow ( )
        {
            try
                    (
                            Connection conn = this.dataSource.getConnection() ;
                            Statement stmt = conn.createStatement() ;
                    )
            {
    //            String lorem = LoremIpsum.getInstance().getWords( 100 , 120 );
                String sql =
                        """
                        INSERT INTO thing_ ()
                        VALUES ()
                        ;
                        """;
                stmt.executeUpdate( sql );
            }
            catch ( SQLException e )
            {
                e.printStackTrace();
            }
        }
        private void dumpRows ( )
        {
            try
                    (
                            Connection conn = this.dataSource.getConnection() ;
                            Statement stmt = conn.createStatement() ;
                    )
            {
                String sql =
                        """
                        TABLE thing_
                        ;
                        """;
                stmt.executeQuery( sql );
                ResultSet rs = stmt.executeQuery( sql );
                while ( rs.next() )
                {
                    String nonsense = rs.getString( "nonsense_" );
                    Instant whenCreated = rs.getObject( "row_created_" , OffsetDateTime.class ).toInstant();
                    UUID id = rs.getObject( "id_" , UUID.class );
                    System.out.println( "whenCreated = " + whenCreated + " | " + "id : " + id + " | " + "nonsense = " + nonsense );
                }
            }
            catch ( SQLException e )
            {
                e.printStackTrace();
            }
        }
    
        private void populateDatabase ( )
        {
        }
        private void exportDatabaseToCsv ( )
        {
        }
    }
    
    

あなたの答え