我很难理解如何使用JOOQ处理具有一对多和多对多关系的POJO。
我存储由玩家创建的位置(一对多关系)。一个位置可以容纳多个其他可能访问它的玩家(多对多关系)。数据库布局归结为以下内容:
CREATE TABLE IF NOT EXISTS `Player` (
`player-id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`player` BINARY(16) NOT NULL,
PRIMARY KEY (`player-id`),
UNIQUE INDEX `U_player` (`player` ASC))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `Location` (
`location-id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL,
`player-id` INT UNSIGNED NOT NULL COMMENT '
UNIQUE INDEX `U_name` (`name` ASC),
PRIMARY KEY (`location-id`),
INDEX `Location_Player_fk` (`player-id` ASC),
CONSTRAINT `fk_location_players1`
FOREIGN KEY (`player-id`)
REFERENCES `Player` (`player-id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `location2player` (
`location-id` INT UNSIGNED NOT NULL,
`player-id` INT UNSIGNED NOT NULL,
INDEX `fk_ location2player_Location1_idx` (`location-id` ASC),
INDEX `fk_location2player_Player1_idx` (`player-id` ASC),
CONSTRAINT `fk_location2player_Location1`
FOREIGN KEY (`location-id`)
REFERENCES `Location` (`location-id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_location2player_Player1`
FOREIGN KEY (`player-id`)
REFERENCES `Player` (`player-id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
在我的Java应用程序中,所有这些信息都存储在一个POJO中。请注意,玩家和受邀玩家列表可以从应用程序内部更新,并且需要在数据库中进行更新:
public class Location {
private final String name;
private UUID player;
private List<UUID> invitedPlayers;
public void setPlayer(UUID player) {
this.player = player;
}
public void invitePlayer(UUID player) {
invitedPlayers.add(player);
}
public void uninvitePlayer(UUID player) {
invitedPlayers.remove(player);
}
//additional methods…
}
我能否使用JOOQ的POJO映射将这三个记录映射到单个POJO中?我能否从此POJO中使用JOOQ的CRUD功能来更新一对多和多对多关系?如果不能使用POJO映射,是否可以以任何方式利用JOOQ,而不是仅用它来编写SQL语句?
JOIN
子句获取数据,并将每个附加行添加到POJO中的集合中,但是在JOOQ中,RecordMapper无法访问先前的对象。当创建相应的对象时,我是否需要在RecordMapper
中执行另一个查询以获取多对多关系?还是有其他方法可以做到这一点? - theeRecordMapper
是一个函数式接口,因此实现一些“有状态”的分组算法并不容易。但我们也有各种Result.intoGroups()
。也许这些会有所帮助?另一个选择是利用像 ModelMapper 这样的工具,它本身就支持 jOOQ。无论如何,您永远不应该执行两个查询,只是因为 ResultSet 到对象映射算法变得有点复杂。 - Lukas Eder