如何在JOOQ中处理外键关系

时间:2015-06-21 12:21:01

标签: java jooq

我必须创建一个具有某些给定属性的实体的新记录。

更像是使用 49 Got: -124 替换现有记录并替换某些值。我可以为一个表做这个,但我找到了正确的方法为相关实体做这件事。

例如:主表是学生,我需要10年级学生的新记录。我可以获取10年级学生的记录并更改名称并保存。

JOOQ

但是现在我也想创建相关的对象,比如地址,爱好是相关的表。

最好的方法是什么?

1 个答案:

答案 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已经在拿起您的学生表,那么您的hobbyaddress表也将被选中。然后,您可以像在常规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