Java jooq无法从a类转换为b类

Java jooq无法从a类转换为b类,java,sql,postgresql,dao,jooq,Java,Sql,Postgresql,Dao,Jooq,我有个问题,我认为可以很容易地解决,但我做不到 我有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类和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的对象作为字符串用户名存储在实体中。所以,要从应用程序中的db中获得类A的对象,我必须读取一条记录并创建类B的对象。 我想用jooq创建查询,但jooq不知道如何将这个字符串用户名转换为类B的实例。如何告诉jooq它应该如何将数据库对象映射到类A的对象

A类相当于人,B类相当于执行者

我的问题

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在其中有一个未记录的特性,允许您在使用任何
到(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
当使用
到(类)
方法时,您可以实现自己的映射算法,如下所述:

使用显式记录映射器: 当然,没有什么强迫您依赖jOOQ的内置自动映射功能。您可以这样编写自己的算法,例如:

jooq.select()
    .from(PERSON)
    .where(PERSON.ID.eq(id))
    .fetchOne(r -> new Person(new Executor(r.get(PERSON.FIRST_NAME), ...));

(记录在案,通过用A和B“抽象”你的具体类名,你使问题变得更复杂了……)我建议你要么坚持抽象,要么坚持实名)是的,你是对的。我将更改它,以便其他人可以使用它。我将在今天晚些时候阅读它,但感谢您的回答。@lukas这很酷,但这可以在我们获取数据时使用。如何创建或更新?如何处理这个问题?@hya:由于抓取是实验性的,目前还没有实现。您必须自己映射嵌套类