代码之家  ›  专栏  ›  技术社区  ›  Jozef Morvay

jOOQ-如何使用。whereNotExists()正确吗?

  •  0
  • Jozef Morvay  · 技术社区  · 7 年前

    我想坚持每天收盘的实体,代表股票收盘价。

    public class DailyData {
        private Long       id;
        private String     ticker;
        private BigDecimal open;
        private BigDecimal high;
        private BigDecimal low;
        private BigDecimal close;
        private Timestamp  date;
        //getters, setters
    }
    

    由于数据提供者的API有限,我可能会得到某些日期的重复条目(例如,如果我只需要两天,我仍然需要一个月的数据)。显然,我只希望每个日期有一条记录,所以数据库中已经存在的任何日期都不应该被持久化。

    这可能已经得到了回答 here ,但我在实践中遇到了困难。特别是,我不知道如何传递要持久化的实际值。这是根据链接中的示例改编的:

    Param<Integer> myId = param("date", Timestamp.class);
    create.insertInto(DATA, DATA.TICKER, DATA.OPEN, DATA.HIGH, DATA.LOW, DATA.CLOSE, DATA.DATE)
                .select(
                        select(
                                date,
                                param("ticker", DATA.TICKER.getType()),
                                param("open", DATA.OPEN.getType()),
                                param("high", DATA.HIGH.getType()),
                                param("low", DATA.LOW.getType()),
                                param("close", DATA.CLOSE.getType()),
                                param("date", DATA.DATE.getType())
                        )
                                .whereNotExists(
                                        selectOne()
                                                .from(DATA)
                                                .where(DATA.DATE.eq(date))
                                )
                );
    
    1. 示例中传递的实际值在哪里?没有呼叫。values()DSL命令,通常出现在jOOQ文档中,告诉它要插入哪些值。
    2. 是不需要在末尾执行?
    3. 有一个batchInsert()命令可以一次持久化多个实体/行。上面提到的例子有很多种吗?或者,我只需遍历所有实体并分别对每个实体执行唯一性检查?
    1 回复  |  直到 7 年前
        1
  •  0
  •   Lukas Eder    7 年前
    1. 示例中传递的实际值在哪里?没有呼叫。values()DSL命令,通常出现在jOOQ文档中,告诉它要插入哪些值。

    为什么要通过使用命名参数API DSL.param() ? 只需通过 DSL.val() 你会没事的。例如。

    select(
        date,
        val(ticker),
        val(open),
        val(high),
        val(low),
        val(close),
        val(date)
    )
    

    事实上,还有 DSL.param(String, T) 方法,您可以使用该方法传递实际值。

    可能应该有更多的重载。我已经为此创建了一个功能请求: https://github.com/jOOQ/jOOQ/issues/7136

    但是,使用 INSERT .. ON CONFLICT 在PostgreSQL中。 See also my answer to this question here .

    1. 是不需要在末尾执行?

    是的。

    1. 有一个batchInsert()命令可以一次持久化多个实体/行。上面提到的例子有很多种吗?或者,我只需遍历所有实体并分别对每个实体执行唯一性检查?

    您可以批处理任何语句。相关文件如下: https://www.jooq.org/doc/latest/manual/sql-execution/batch-execution