我有两张桌子,一张是城市,一张是国家.它们之间的映射是单向的,如下所示:

relation

另外,我还有两个POJO DTO,如下所示:

relation between dto

实体类由jooq生成.

现在,我想不出当我调用getCityByID(字符串CityID)时,如何才能像这样检索响应:

cityDto

你能帮我解决这个问题吗?我对JOOQ和DSLContext方法非常陌生.

推荐答案

在jOOQ中嵌套记录有两种主要方式:

直接在SQL中

jOOQ supports SQL nested records就像标准的SQL和一些实现(例如,PostgreSQL).如果您的RDBMS本身不支持它,那么jOOQ将模拟它.您可以将ad-hoc converters附加到嵌套的记录表达式,以便将它们映射到您的自定义CountryDto类型,如下所示:

List<CityDto> result =
ctx.select(
      CITY.ID,
      CITY.NAME,
      row(CITY.country().ID, CITY.country().NAME).mapping(CountryDto::new))
   .from(CITY)
   .fetch(Records.mapping(CityDto::new));

这假设您的DTO上有适当的构造函数.我想您必须为此添加一个Lombok @AllArgsConstructor注释(我非常推荐它,它将与jOOQ的ad-hoc conversion一起工作得非常好!)

为方便起见,我使用的是implicit path joins,但显然您也可以使用显式连接.

Using DefaultRecordMapper functionality

reflection based, historic DefaultRecordMapper也可以使用点符号来嵌套记录,如果这更符合您的风格的话.只要写下这句话:

List<CityDto> result =
ctx.select(
      CITY.ID,
      CITY.NAME,
      CITY.country().ID.as("countryDto.id"), 
      CITY.country().NAME.as("countryDto.name"))
   .from(CITY)
   .fetchInto(CityDto.class);

因为这是纯粹基于反射的,所以没有类型安全.一旦您在DTO中重命名属性,查询将停止工作.出于这个原因,我个人建议使用第一个解决方案中的显式类型安全方法,特别是因为它也可以与nested collections一起使用.

Java相关问答推荐

Analyst Idea构建错误:NoClassDefFound错误:javax/html/bind/JAVAX Bwitch [SOLVED]

Spring Webocket:尽管凭据设置为False,但MLhttpsify和Fetch请求之间的CORS行为存在差异

Android -如何修复Java.time.zone. ZoneRulesExcept:未知时区ID:Europe/Kyiv

当切换javaFX场景时,stage的大小正在Minimize

转换为Biggram

所有 case 一起输入时输出错误,而单独放置时输出正确

JavaFX如何在MeshView中修复多个立方体?

GSON期间的Java类型擦除

自定义批注的外推属性值

我如何知道MediaDiscoverer何时完成发现介质?

用户填充的数组列表永不结束循环

SonarLint:只能有条件地调用方法(S)

匹配一组字符或另一组字符

MimeMessage emlMessage=new MimeMessage(Session,emlInputStream);抛出InvocationTargetException

删除打印语句会影响功能...腐败在起作用?

当b是一个字节并且在Java中值为-1时,为什么b>;>;>;1总是等于-1?

是否有一个Java Future实现可以在池繁忙时在调用者线程中执行?

Java 21中泛型的不兼容更改

每次我需要时创建和关闭数据库连接会有什么效果吗?

如何在右击时 Select 新行?