我有两张桌子,一张是城市,一张是国家.它们之间的映射是单向的,如下所示:
另外,我还有两个POJO DTO,如下所示:
实体类由jooq生成.
现在,我想不出当我调用getCityByID(字符串CityID)时,如何才能像这样检索响应:
你能帮我解决这个问题吗?我对JOOQ和DSLContext方法非常陌生.
我有两张桌子,一张是城市,一张是国家.它们之间的映射是单向的,如下所示:
另外,我还有两个POJO DTO,如下所示:
实体类由jooq生成.
现在,我想不出当我调用getCityByID(字符串CityID)时,如何才能像这样检索响应:
你能帮我解决这个问题吗?我对JOOQ和DSLContext方法非常陌生.
在jOOQ中嵌套记录有两种主要方式:
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,但显然您也可以使用显式连接.
DefaultRecordMapper
functionalityreflection 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一起使用.