jooq无法从a类转换为b类

时间:2016-11-08 13:15:16

标签: 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实体中存储为字符串userName。因此,要在app中使用db中的A类对象,我必须读取A记录并创建B类对象。 我想用jooq创建查询,但是jooq不知道如何将这个字符串用户名转换为B类实例。如何告诉jooq它应该如何将数据库A对象映射到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]
...

我想我应该使用这个http://www.jooq.org/doc/3.8/manual/code-generation/custom-data-type-bindings/,但我无法实现它。

1 个答案:

答案 0 :(得分:2)

有不同的方法可以解决这个问题:

使用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将在executor类中搜索Person属性,并将尾随子路径放入嵌套对象中。 / p>

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

// 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)方法时,您可以实现自己的映射算法:

http://www.jooq.org/doc/latest/manual/sql-execution/fetching/pojos-with-recordmapper-provider

使用显式记录映射器:

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

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