gpt4 book ai didi

java - 这个提取可以完成更多 "elegantly"吗?

转载 作者:行者123 更新时间:2023-11-30 03:06:22 24 4
gpt4 key购买 nike

我正在使用 jOOQ,但我不太确定我是否按照我应该的方式使用它。我想知道我下面的代码是否可以写得更优雅。我所说的“优雅”是指基本上更改与列相关的任何内容都是相当烦人的。如果我添加、删除或更改列的顺序,我必须更改所有结果和 Table<>我非常确定将来我会多次遇到如下这样的请求,因此我想知道是否可以简化此操作。

此外,我注意到on.fetch()的结果类似的是 Result<Record6<..>> 。我看了那些RecordX类。其中有22个。我认为我永远不会需要它,但如果我想阅读 23 列怎么办?

public List<StoreItemDTO> getItems(Long storeId) {

// Get all item_ids for the store

SelectConditionStep<Record1<Long>> where = this.ctx
.select(STORE_ITEM.ID)
.from(STORE_ITEM)
.where(STORE_ITEM.STORE_ID.eq(storeId));

// Get all store_item_details (all languages) according to the fetched item_ids

Table<Record5<Long, Long, String, String, Long>> storeItemDetails = this.ctx
.select(
STORE_ITEM_DETAILS.ID,
STORE_ITEM_DETAILS.STORE_ITEM_ID,
STORE_ITEM_DETAILS.NAME,
STORE_ITEM_DETAILS.DESCRIPTION,
STORE_ITEM_DETAILS.STORE_LANGUAGE_ID
)
.from(STORE_ITEM_DETAILS)
.where(STORE_ITEM_DETAILS.STORE_ITEM_ID.in(where))
.asTable("storeItemDetails");

// Join the result and get the items for the store in all languages

SelectOnConditionStep<Record6<Long, Long, Long, String, String, Long>> on = this.ctx
.select(
STORE_ITEM.ID,
STORE_ITEM.STORE_ID,
storeItemDetails.field(STORE_ITEM_DETAILS.ID),
storeItemDetails.field(STORE_ITEM_DETAILS.NAME),
storeItemDetails.field(STORE_ITEM_DETAILS.DESCRIPTION),
storeItemDetails.field(STORE_ITEM_DETAILS.STORE_LANGUAGE_ID)
)
.from(STORE_ITEM)
.join(storeItemDetails)
.on(storeItemDetails.field(STORE_ITEM_DETAILS.STORE_ITEM_ID).eq(STORE_ITEM.ID));

Result<Record6<Long, Long, Long, String, String, Long>> fetch = on.fetch();

// ..

return null;
}

最佳答案

如果您不需要类型安全,请不要使用它。例如。以下也可以正常工作

// Get all item_ids for the store
SelectConditionStep<?> where = this.ctx...

// Get all store_item_details (all languages) according to the fetched item_ids
Table<?> storeItemDetails = this.ctx...

// Join the result and get the items for the store in all languages
SelectOnConditionStep<Record6<Long, Long, Long, String, String, Long>> on = this.ctx...

当编译器可以执行类型推断时,扩展类型安全性对于编译器来说非常好,例如当你写作时:

  • UNIONs
  • IN 谓词
  • 当您将结果提取到 lambda 表达式时
  • 等等

您可能会写下所有这些类型,因为您正在使用 IDE 自动完成功能,并且您的 IDE 首先提出最具体的建议。但是使用通配符也同样有效,在上面的情况下,例如:

Result<?> fetch = this.ctx 
// ..
.fetch();

for(Record record : fetch) {
String value = record.getValue(STORE_ITEM_DETAILS.NAME);
System.out.println(value);
}

I don't think that I'll ever need that but what if I wanted to read 23 columns?

没有什么重大变化。另请参阅手册: http://www.jooq.org/doc/latest/manual/sql-execution/fetching/record-n

您仍然可以选择是否使用显式记录类型(记录上没有学位):

Result<Record> result = query.fetch();

...或者是否使用通配符:

Result<?> result = query.fetch();

关于java - 这个提取可以完成更多 "elegantly"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34684863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com