java—在postgresql中添加空日期值

xxb16uws  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(335)

**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

上个月关门了。
改进这个问题
我正在将oracle数据库查询转换为postgresql查询。oracle查询中的日期值有空参数。我已经搜索过了,但找不到任何有关postgresql查询的内容。postgresql查询中的空日期值可以使用什么?任何帮助都将不胜感激。谢谢。
edit:我使用的是java,oracle查询是

INSERT INTO tableName (name, age, date) VALUES(?,?,?)

值为“james”、“10”、null。
在postgres查询中,当我尝试将null作为参数时,它会给出一个异常。

kse8i1jr

kse8i1jr1#

热释光;博士

路过 null 在javajdbc代码中作为 PreparedStatement::set… 导致数据库行中出现空值。
例外情况:如果用 NOT NULL ,那么这样的提交当然会被数据库系统拒绝。

在java中传递null

您的问题不完整,应根据发布的评论重写。
但我可以展示一些通用的示例代码供您阅读。路过 null 在java中,通过jdbc将导致数据库中出现空值。

pstmt.setString( 1 , "John Doe" );  
pstmt.setObject( 2 , null );        // <-- Passing `null` into the SQL prepared statement.
pstmt.executeUpdate();

下面是一个使用h2数据库引擎的完整示例应用程序。h2是关系数据库的纯java实现,可以像任何其他依赖项一样拉入示例应用程序。
我希望postgres上也会运行同样的代码。

package work.basil.example;

import java.sql.*;
import java.time.LocalDate;
import java.time.Month;
import java.util.Objects;
import java.util.UUID;

import org.h2.jdbcx.JdbcDataSource;

public class ExampleH2App
{

    public static void main ( String[] args )
    {
        ExampleH2App app = new ExampleH2App();
        app.doIt();
    }

    private void doIt ( )
    {
        JdbcDataSource dataSource = Objects.requireNonNull( new JdbcDataSource() );  // Implementation of `DataSource` bundled with H2.
        // The `mem` in URL means "in-memory-only".
        // Set `DB_CLOSE_DELAY` to `-1` to keep in-memory database in existence after connection closes.
        dataSource.setURL( "jdbc:h2:mem:h2_example_db;DB_CLOSE_DELAY=-1" );
        dataSource.setUser( "scott" );
        dataSource.setPassword( "tiger" );

        try (
                Connection conn = dataSource.getConnection() ;
                // Set `DB_CLOSE_DELAY` to `-1` to keep in-memory database in existence after connection closes.
                Statement stmt = conn.createStatement() ;
        )
        {
            String sql =
                    """
                    CREATE TABLE person_ ( 
                        pkey_ UUID NOT NULL DEFAULT RANDOM_UUID() PRIMARY KEY ,
                        name_ VARCHAR NOT NULL ,
                        birthdate_ DATE  
                    );
                    """;
            stmt.execute( sql );

            // Insert row.
            sql = """
                  INSERT INTO person_( name_ , birthdate_ )
                  VALUES( ? , ? )
                  ;
                  """;

            try (
                    PreparedStatement pstmt = conn.prepareStatement( sql , Statement.RETURN_GENERATED_KEYS ) ;
            )
            {
                pstmt.setString( 1 , "Margaret Hamilton" );  // https://en.wikipedia.org/wiki/Margaret_Hamilton_(software_engineer)
                pstmt.setObject( 2 , LocalDate.of( 1936 , Month.AUGUST , 17 ) );
                pstmt.executeUpdate();

                pstmt.setString( 1 , "John Doe" );
                pstmt.setObject( 2 , null );  // <-- Passing `null` into the SQL prepared statement.
                pstmt.executeUpdate();

                ResultSet rs = pstmt.getGeneratedKeys();
                System.out.println( "INFO - Reporting generated keys." );
                while ( rs.next() )
                {
                    UUID uuid = rs.getObject( 1 , UUID.class );
                    System.out.println( "generated keys: " + uuid );
                }
            }

            // Dump all rows.
            System.out.println( "INFO - Reporting all rows in table `person_`." );
            sql = "SELECT * FROM person_";
            try ( ResultSet rs = stmt.executeQuery( sql ) ; )
            {
                while ( rs.next() )
                {
                    UUID pkey = rs.getObject( "pkey_" , UUID.class );
                    String name = rs.getString( "name_" );
                    LocalDate birthdate = rs.getObject( "birthdate_" , LocalDate.class );
                    System.out.println( "Person: " + pkey + " | " + name + " | " + birthdate );
                }
            }
        }
        catch ( SQLException e )
        {
            e.printStackTrace();
        }
    }
}

运行时:

INFO - Reporting generated keys.
generated keys: 386460f8-c2d4-4207-9291-e5aa7eb51471
INFO - Reporting all rows in table `person_`.
Person: ad05fb5e-e731-4a61-ae03-9ed8d9ede100 | Margaret Hamilton | 1936-08-17
Person: 386460f8-c2d4-4207-9291-e5aa7eb51471 | John Doe | null

提示:避免使用关键字命名数据库中的列或其他对象,例如 date . 不幸的是,在不同的数据库系统中有超过一千个关键字和保留字。因此,避免所有这些都是棘手的。我的解决方案是:我用一个尾随下划线命名所有数据库对象。sql规范明确承诺在任何命名中都不会使用尾随下划线。
顺便说一下,不需要在表中存储年龄。给定存储的日期,可以在sql查询或java代码中动态计算年龄。

相关问题