JOOQ 3.14 中的 NoSuchMethod InsertQuery with Postgresql
NoSuchMethod in JOOQ 3.14 InsertQuery with Postgresql
我正在尝试使用 Jooq 的 InsertQuery 将记录插入 PostgresQL 数据库,但我 运行 出现以下错误:
java.lang.NoSuchMethodError: 'org.jooq.UniqueKey org.jooq.impl.Internal.createUniqueKey(org.jooq.Table, org.jooq.Name, org.jooq.TableField[], boolean)'
at fi.eriran.generated.jooq.Keys.<clinit>(Keys.java:36) ~[classes/:na]
at fi.eriran.generated.jooq.tables.User.getPrimaryKey(User.java:124) ~[classes/:na]
at org.jooq.impl.UpdatableRecordImpl.getPrimaryKey(UpdatableRecordImpl.java:119) ~[jooq-3.13.4.jar:na]
at org.jooq.impl.AbstractRecord.set(AbstractRecord.java:349) ~[jooq-3.13.4.jar:na]
at org.jooq.impl.AbstractRecord.set(AbstractRecord.java:325) ~[jooq-3.13.4.jar:na]
at fi.eriran.generated.jooq.tables.records.UserRecord.setUsername(UserRecord.java:44) ~[classes/:na]
at fi.eriran.criminalapi.main.dao.user.query.UserQuery.createInsertRecord(UserQuery.java:37) ~[classes/:na]
at fi.eriran.criminalapi.main.dao.user.query.UserQuery.insert(UserQuery.java:22) ~[classes/:na]
我正在使用的查询 class 如下所示:
@Component
public class UserQuery {
@Autowired
private DslContext ctx;
public InsertQuery<UserRecord> insert(NewUser newUser) {
InsertQuery<UserRecord> insertQuery = ctx.insertQuery(USER);
insertQuery.addRecord(createInsertRecord(newUser));
insertQuery.setReturning();
return insertQuery;
}
private UserRecord createInsertRecord(NewUser newUser) {
UserRecord userRecord = new UserRecord();
userRecord.setUsername(newUser.getUserName());
userRecord.setPassword(newUser.getPassword());
return userRecord;
}
}
用户数据库 table 如下所示。它在用户名列上有一个唯一键,在 ID 列上有一个主键。
CREATE TABLE criminal."user" (
id serial NOT NULL,
username varchar(500) NOT NULL,
"password" varchar(500) NOT NULL,
created_at timestamptz(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT user_pk PRIMARY KEY (id),
CONSTRAINT user_un UNIQUE (username)
);
CREATE INDEX user_username_idx ON criminal."user" (username);
如果我使用 ctx.insertInto 执行此操作...它工作正常。我最初使用 Jooq 3.14.0 但升级到最新的 3.14.4 在这里没有帮助。生成的 Keys class 一定有问题,因为在 Keys class 初始化之前一切正常。是 Postgresql table 结构有问题还是代码生成出了问题?
这里有完整的回购协议:https://github.com/EriRan/Criminal-API/tree/security-attempt
你说你正在使用 jOOQ 3.14,但在你的堆栈跟踪中,有对版本 3.13.4 的引用:
at org.jooq.impl.UpdatableRecordImpl.getPrimaryKey(UpdatableRecordImpl.java:119) ~[jooq-3.13.4.jar:na]
您可能没有正确设置您的类路径。生成代码的 jOOQ 版本和 运行 您的代码的 jOOQ 版本必须相同。
我正在尝试使用 Jooq 的 InsertQuery 将记录插入 PostgresQL 数据库,但我 运行 出现以下错误:
java.lang.NoSuchMethodError: 'org.jooq.UniqueKey org.jooq.impl.Internal.createUniqueKey(org.jooq.Table, org.jooq.Name, org.jooq.TableField[], boolean)'
at fi.eriran.generated.jooq.Keys.<clinit>(Keys.java:36) ~[classes/:na]
at fi.eriran.generated.jooq.tables.User.getPrimaryKey(User.java:124) ~[classes/:na]
at org.jooq.impl.UpdatableRecordImpl.getPrimaryKey(UpdatableRecordImpl.java:119) ~[jooq-3.13.4.jar:na]
at org.jooq.impl.AbstractRecord.set(AbstractRecord.java:349) ~[jooq-3.13.4.jar:na]
at org.jooq.impl.AbstractRecord.set(AbstractRecord.java:325) ~[jooq-3.13.4.jar:na]
at fi.eriran.generated.jooq.tables.records.UserRecord.setUsername(UserRecord.java:44) ~[classes/:na]
at fi.eriran.criminalapi.main.dao.user.query.UserQuery.createInsertRecord(UserQuery.java:37) ~[classes/:na]
at fi.eriran.criminalapi.main.dao.user.query.UserQuery.insert(UserQuery.java:22) ~[classes/:na]
我正在使用的查询 class 如下所示:
@Component
public class UserQuery {
@Autowired
private DslContext ctx;
public InsertQuery<UserRecord> insert(NewUser newUser) {
InsertQuery<UserRecord> insertQuery = ctx.insertQuery(USER);
insertQuery.addRecord(createInsertRecord(newUser));
insertQuery.setReturning();
return insertQuery;
}
private UserRecord createInsertRecord(NewUser newUser) {
UserRecord userRecord = new UserRecord();
userRecord.setUsername(newUser.getUserName());
userRecord.setPassword(newUser.getPassword());
return userRecord;
}
}
用户数据库 table 如下所示。它在用户名列上有一个唯一键,在 ID 列上有一个主键。
CREATE TABLE criminal."user" (
id serial NOT NULL,
username varchar(500) NOT NULL,
"password" varchar(500) NOT NULL,
created_at timestamptz(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT user_pk PRIMARY KEY (id),
CONSTRAINT user_un UNIQUE (username)
);
CREATE INDEX user_username_idx ON criminal."user" (username);
如果我使用 ctx.insertInto 执行此操作...它工作正常。我最初使用 Jooq 3.14.0 但升级到最新的 3.14.4 在这里没有帮助。生成的 Keys class 一定有问题,因为在 Keys class 初始化之前一切正常。是 Postgresql table 结构有问题还是代码生成出了问题?
这里有完整的回购协议:https://github.com/EriRan/Criminal-API/tree/security-attempt
你说你正在使用 jOOQ 3.14,但在你的堆栈跟踪中,有对版本 3.13.4 的引用:
at org.jooq.impl.UpdatableRecordImpl.getPrimaryKey(UpdatableRecordImpl.java:119) ~[jooq-3.13.4.jar:na]
您可能没有正确设置您的类路径。生成代码的 jOOQ 版本和 运行 您的代码的 jOOQ 版本必须相同。