我必须创建一个具有某些给定属性的实体的新记录。
更像是使用 49
Got: -124
替换现有记录并替换某些值。我可以为一个表做这个,但我找到了正确的方法为相关实体做这件事。
例如:主表是学生,我需要10年级学生的新记录。我可以获取10年级学生的记录并更改名称并保存。
JOOQ
但是现在我也想创建相关的对象,比如地址,爱好是相关的表。
最好的方法是什么?
答案 0 :(得分:3)
如果我理解正确,大多数代码示例看起来都是不必要的。要更新学生姓名,您可以执行以下操作:
final List<StudentRecord> students = context.selectFrom(Student.STUDENT)
.where(Student.STUDENT.GRADE.eq(10))
.fetchInto(StudentRecord.class);
for (final StudentRecord student : students) {
student.setName("some other name");
}
context.batchStore(students).execute();
重新添加其他表格,您应该可以像添加学生表一样进行。如果您的数据库看起来像这些行,学生有一个地址,但可能有很多爱好:
create table address(
id serial primary key,
street text not null
-- other fields, etc
);
create table student(
id serial primary key,
name text not null,
grade int not null,
address_id not null references address(id)
-- ...
);
create table hobby(
id serial primary key,
student_id not null references student(id),
name text
-- ...
);
假设您在同一架构中拥有它并且jOOQ已经在拿起您的学生表,那么您的hobby
和address
表也将被选中。然后,您可以像在常规sql中那样获取:
final Result<Record<Integer,String,String,String>> ret = context
.select(Student.STUDENT.ID,
Student.STUDENT.NAME,
Address.ADDRESS.STREET,
Hobby.HOBBY.NAME)
.from(Student.STUDENT)
.join(Hobby.HOBBY)
.on(Student.STUDENT.ID.eq(Hobby.HOBBY.STUDENT_ID))
.join(Address.ADDRESS)
.on(Student.STUDENT.ADDRESS_ID.eq(Address.ADDRESS.ID))
.where(Student.STUDENT.GRADE.eq(10))
.orderBy(Student.STUDENT.NAME.asc())
.fetch();
Integer lastStudentId = null;
for (final Record<Integer,String,String,String> val : ret) {
final Integer studentId = val.getValue(Student.STUDENT.ID,);
if (!studentId.equals(lastStudentId)) {
System.out.println("Student " + val.getValue(Student.STUDENT.NAME)
+ " who lives on " + val.getValue(Address.ADDRESS.STREET)
+ " street has hobbies:"
);
}
lastStudentId = studentId;
System.out.println("\t" + val.getValue(Hobby.HOBBY.NAME));
}
如果您的问题更多的是关于数据库的设计(即,如果您的地址是个人的并且拥有自己的pk,或者他们应该由学生拥有并且具有与学生相同的ID,那么那么),那么我认为这不是一个jOOQ问题,可能更适合在这里发帖:https://dba.stackexchange.com/?tags=database-design。