java convertall_java – jooq无法从类a转换为类b

我有问题,我认为可以轻松解决,但我不能这样做.

我有一个A和B类,A类存储在postgres db中:

public class A() {

private B b;

...

}

public class B() {

private String firstName;

private String lastName;

private String personId;

private String userName;

}

在数据库中,类b的对象在A实体中存储为字符串userName.因此,要在app中使用db中的A类对象,我必须读取A记录并创建B类对象.

我想用jooq创建查询,但jooq不知道如何将此字符串用户名转换为类B的实例.如何告诉jooq应该如何将数据库对象映射到类A的对象.

类等同于Person,B类等同于Executor.

我的查询

return jooq.select()

.from(PERSON)

.where(PERSON.ID.eq(id))

.fetchOneInto(Person.class);

这是我的查询抛出的异常

Caused by: org.jooq.exception.DataTypeException: Cannot convert from superadmin (class java.lang.String) to class fi.ssm.oksa.domain.person.Executor

at org.jooq.tools.Convert$ConvertAll.fail(Convert.java:1118) ~[jooq-3.8.5.jar:na]

...

最佳答案 有不同的方法来解决这个问题:

使用jOOQ的未记录(从3.8版开始)嵌套记录映射功能

jOOQ在其DefaultRecordMapper中有一个未记录的功能,允许您在使用任何into(Class)方法时嵌套结果记录.您必须手动指定嵌套记录的“路径”,就像您实际使用ORDBMS嵌套记录一样,如下所示:

jooq.select(

PERSON.FIRST_NAME.as("executor.first_name"),

PERSON.LAST_NAME.as("executor.last_name"),

PERSON.PERSON_ID.as("executor.person_id"),

PERSON.USER_NAME.as("executor.user_name"))

.from(PERSON)

.where(PERSON.ID.eq(id))

.fetchOneInto(Person.class);

当您以这种方式对列进行别名时,DefaultRecordMapper将在Person类中搜索executor属性,并将尾随子路径放入嵌套对象中.

在这个例子中,我将假设您的类略有修改版本:

// instead of A

public class Person {

private Executor executor;

...

}

// instead of B

public class Executor {

private String firstName;

private String lastName;

private String personId;

private String userName;

}

重写DefaultRecordMapper

在使用如下所述的into(Class)方法时,您可以实现自己的映射算法:

使用显式记录映射器:

当然,没有什么能够让你依赖于jOOQ的内置自动映射功能.您可以像这样编写自己的算法,例如:

jooq.select()

.from(PERSON)

.where(PERSON.ID.eq(id))

.fetchOne(r -> new Person(new Executor(r.get(PERSON.FIRST_NAME), ...));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值