jooq 无法从 class a 转换为 class b
jooq cannot convert from class a to class b
我有问题,我认为可以很容易地解决,但我做不到。
我有一个 class A 和 B 并且 class A 存储在 postgres 数据库中:
public class A() {
private B b;
...
}
public class B() {
private String firstName;
private String lastName;
private String personId;
private String userName;
}
在数据库中,class b 的对象作为字符串 userName 存储在 A 实体中。因此,要从应用程序中的数据库中获取 class A 的对象,我必须读取 A 记录并创建 class B 的对象。
我想用 jooq 创建查询,但 jooq 不知道如何将此字符串用户名转换为 class B 的实例。如何告诉 jooq 它应该如何将数据库 A 对象映射到 class A 的对象。
Aclass相当于Person,Bclass相当于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/但是我不能实现它。
有不同的方法可以解决这个问题:
使用 jOOQ 的未记录(自版本 3.8 起)嵌套记录映射功能
jOOQ 在其 DefaultRecordMapper
中有一个未记录的功能,允许您在使用任何 into(Class)
方法时嵌套结果记录。您必须手动指定嵌套记录的 "path",就像您实际使用 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
class 中搜索 executor
属性,并将嵌套对象的尾随子路径。
在这个例子中,我将假定您的 classes:
稍作修改的版本
// 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), ...));
我有问题,我认为可以很容易地解决,但我做不到。
我有一个 class A 和 B 并且 class A 存储在 postgres 数据库中:
public class A() {
private B b;
...
}
public class B() {
private String firstName;
private String lastName;
private String personId;
private String userName;
}
在数据库中,class b 的对象作为字符串 userName 存储在 A 实体中。因此,要从应用程序中的数据库中获取 class A 的对象,我必须读取 A 记录并创建 class B 的对象。 我想用 jooq 创建查询,但 jooq 不知道如何将此字符串用户名转换为 class B 的实例。如何告诉 jooq 它应该如何将数据库 A 对象映射到 class A 的对象。
Aclass相当于Person,Bclass相当于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/但是我不能实现它。
有不同的方法可以解决这个问题:
使用 jOOQ 的未记录(自版本 3.8 起)嵌套记录映射功能
jOOQ 在其 DefaultRecordMapper
中有一个未记录的功能,允许您在使用任何 into(Class)
方法时嵌套结果记录。您必须手动指定嵌套记录的 "path",就像您实际使用 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
class 中搜索 executor
属性,并将嵌套对象的尾随子路径。
在这个例子中,我将假定您的 classes:
稍作修改的版本// 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), ...));