我想坚持每日关闭的实体,代表股票的接近价格。
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))
)
);
答案 0 :(得分:0)
- 示例中传递的实际值在哪里?没有调用.values()DSL命令,它通常出现在jOOQ文档中,告诉它要插入什么值。
醇>
为什么通过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
- 最终不需要.execute吗?
醇>
是的。
- 有一个batchInsert()命令可以同时保存多个实体/行。是否有上述例子的批量种类?或者我只需要遍历所有实体并分别对每个实体执行唯一性检查?
醇>
您可以批处理任何语句。相关文档在这里: https://www.jooq.org/doc/latest/manual/sql-execution/batch-execution