Java jooq无法从a类转换为b类
我有个问题,我认为可以很容易地解决,但我做不到 我有a类和B类,a类存储在postgres db中: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的对象作为
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:由于抓取是实验性的,目前还没有实现。您必须自己映射嵌套类