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

时间:2018-02-01 13:17:34

标签: postgresql jooq

我想坚持每日关闭的实体,代表股票的接近价格。

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有限,我可能会在某些日期获得重复的条目(例如,如果我只需要两天,我仍然需要索取一个月的数据)。显然,我只希望每个日期有一条记录,因此不应该保留DB中已存在的任何日期。

这可能已经回答了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. 最终不需要.execute吗?
  3. 有一个batchInsert()命令可以同时保存多个实体/行。是否有上述例子的批量种类?或者我只需要遍历所有实体并分别对每个实体执行唯一性检查?

1 个答案:

答案 0 :(得分:0)

  
      
  1. 示例中传递的实际值在哪里?没有调用.values()DSL命令,它通常出现在jOOQ文档中,告诉它要插入什么值。
  2.   

为什么通过DSL.param()使用命名参数API?只需通过DSL.val(),你就可以了。 E.g。

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

但是,使用PostgreSQL中的INSERT .. ON CONFLICT可能更好地实现此查询。 See also my answer to this question here

  
      
  1. 最终不需要.execute吗?
  2.   

是的。

  
      
  1. 有一个batchInsert()命令可以同时保存多个实体/行。是否有上述例子的批量种类?或者我只需要遍历所有实体并分别对每个实体执行唯一性检查?
  2.   

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