为什么我无法使用 Jooq 的 into 方法获取 class 中的数据库字段值?
Why am I not able to fetch database field values in a class using Jooq's into method?
这是我使用 Jooq 查询的方法:
private List<UserEmailOrganisation> getEmailsAndOrgNames() {
Result<Record2<String, String>> r = dsl
.fetch(dsl
.select(I_USERS.EMAIL_ID, I_ORGANISATIONS.NAME)
.from(I_USERS)
.leftOuterJoin(I_ORGANISATIONS)
.on(I_USERS.ORGANISATION_ID.equal(I_ORGANISATIONS.ID))
.where(DSL.timestampAdd(I_USERS.UPDATED, MINIMUM_INACTIVE_DATE,
DatePart.DAY).lessOrEqual(DSL.currentTimestamp())));
logger.debug(r.toString());
return r.into(UserEmailOrganisation.class);
}
logger.debug 方法打印 -
|email_id |name |
+-----------------------------------+----------------+
|email1@some.com |org1 |
|email2@some.com |org2 |
所以我的查询 是 返回一些结果。所以我认为问题不在于查询,而在于 into 方法。
这是我的 UserEmailOrganisationclass
public class UserEmailOrganisation {
public String emailId;
public String name;
public UserEmailOrganisation(String emailId, String name) {
this.emailId = emailId;
this.name = name;
}
}
来自 JOOQ 文档
http://www.jooq.org/javadoc/3.5.x/org/jooq/impl/DefaultRecordMapper.html
If no default constructor is available, but at least one "matching" constructor is available, that one is used.
A "matching" constructor is one with exactly as many arguments as this record holds fields
When several "matching" constructors are found, the first one is chosen (as reported by Class.getDeclaredConstructors()
When invoking the "matching" constructor, values are converted onto constructor argument types.
所以我的代码应该可以正常工作?因为它有一个匹配的构造函数。但事实并非如此。我收到以下异常。
org.jooq.exception.MappingException: No matching constructor found on type class com.kubera.insights.admin.jobs.BackOfficeUsersReminderJob$UserEmailOrganisation for record org.jooq.impl.DefaultRecordMapper@2ccd7880
at org.jooq.impl.DefaultRecordMapper.init(DefaultRecordMapper.java:321)
at org.jooq.impl.DefaultRecordMapper.<init>(DefaultRecordMapper.java:257)
at org.jooq.impl.DefaultRecordMapper.<init>(DefaultRecordMapper.java:244)
at org.jooq.impl.DefaultRecordMapperProvider.provide(DefaultRecordMapperProvider.java:81)
at org.jooq.impl.ResultImpl.into(ResultImpl.java:1499)
是否返回空结果?您能否转储此查询的 SQL 文本,然后将其 运行 与 I_USERS table 进行对比以查看是否获得结果?您可能需要添加另一个构造函数来处理空结果。
public class UserEmailOrganisation {
public String emailId;
public String name;
public UserEmailOrganisation(String emailId, String name) {
this.emailId = emailId;
this.name = name;
}
public UserEmailOrganisation(Object response) {
if (response == null) {
// what happens if it's empty?
}
}
}
问题是我使用内部 class 来保存 table 值。
根据问题,这是不可能的 -
https://github.com/jOOQ/jOOQ/issues/1821
将 class UserEmailOrganisation 移到外部解决了问题。
这是我使用 Jooq 查询的方法:
private List<UserEmailOrganisation> getEmailsAndOrgNames() {
Result<Record2<String, String>> r = dsl
.fetch(dsl
.select(I_USERS.EMAIL_ID, I_ORGANISATIONS.NAME)
.from(I_USERS)
.leftOuterJoin(I_ORGANISATIONS)
.on(I_USERS.ORGANISATION_ID.equal(I_ORGANISATIONS.ID))
.where(DSL.timestampAdd(I_USERS.UPDATED, MINIMUM_INACTIVE_DATE,
DatePart.DAY).lessOrEqual(DSL.currentTimestamp())));
logger.debug(r.toString());
return r.into(UserEmailOrganisation.class);
}
logger.debug 方法打印 -
|email_id |name |
+-----------------------------------+----------------+
|email1@some.com |org1 |
|email2@some.com |org2 |
所以我的查询 是 返回一些结果。所以我认为问题不在于查询,而在于 into 方法。
这是我的 UserEmailOrganisationclass
public class UserEmailOrganisation {
public String emailId;
public String name;
public UserEmailOrganisation(String emailId, String name) {
this.emailId = emailId;
this.name = name;
}
}
来自 JOOQ 文档 http://www.jooq.org/javadoc/3.5.x/org/jooq/impl/DefaultRecordMapper.html
If no default constructor is available, but at least one "matching" constructor is available, that one is used.
A "matching" constructor is one with exactly as many arguments as this record holds fields When several "matching" constructors are found, the first one is chosen (as reported by Class.getDeclaredConstructors() When invoking the "matching" constructor, values are converted onto constructor argument types.
所以我的代码应该可以正常工作?因为它有一个匹配的构造函数。但事实并非如此。我收到以下异常。
org.jooq.exception.MappingException: No matching constructor found on type class com.kubera.insights.admin.jobs.BackOfficeUsersReminderJob$UserEmailOrganisation for record org.jooq.impl.DefaultRecordMapper@2ccd7880
at org.jooq.impl.DefaultRecordMapper.init(DefaultRecordMapper.java:321)
at org.jooq.impl.DefaultRecordMapper.<init>(DefaultRecordMapper.java:257)
at org.jooq.impl.DefaultRecordMapper.<init>(DefaultRecordMapper.java:244)
at org.jooq.impl.DefaultRecordMapperProvider.provide(DefaultRecordMapperProvider.java:81)
at org.jooq.impl.ResultImpl.into(ResultImpl.java:1499)
是否返回空结果?您能否转储此查询的 SQL 文本,然后将其 运行 与 I_USERS table 进行对比以查看是否获得结果?您可能需要添加另一个构造函数来处理空结果。
public class UserEmailOrganisation {
public String emailId;
public String name;
public UserEmailOrganisation(String emailId, String name) {
this.emailId = emailId;
this.name = name;
}
public UserEmailOrganisation(Object response) {
if (response == null) {
// what happens if it's empty?
}
}
}
问题是我使用内部 class 来保存 table 值。
根据问题,这是不可能的 -
https://github.com/jOOQ/jOOQ/issues/1821
将 class UserEmailOrganisation 移到外部解决了问题。