Я полагаю, что вы делаете это в порядке, обратном тому, что вы должны делать.
Рассмотрите следующее, где
NestingClass.java : -
public class NestingClass {
public int studentCount;
@Embedded
Instructor instructor;
public NestingClass(StudentInstructorDao studentInstructorDao, int instructorId) {
this.instructor = studentInstructorDao.getInstructor(instructorId);
this.studentCount = studentInstructorDao.getStudentCount(instructorId);
}
public Instructor getInstructor() {
return instructor;
}
public void setInstructor(Instructor instructor) {
this.instructor = instructor;
}
public int getStudentCount() {
return studentCount;
}
public void setStudentCount(int studentCount) {
this.studentCount = studentCount;
}
}
- , т. Е. Инструктор был встроен.
и Instructor.class : -
@Entity
public class Instructor {
@PrimaryKey(autoGenerate = true)
private long id;
private String fullNname;
public long getId(){ return id; }
public String getFullNname() { return fullNname; }
public void setId(long id){ this.id = id; }
public void setFullNname(String fullName){ this.fullNname = fullName; }
}
- т.е. число студентов не является частью Инструктора
И Dao StudentInstructorDao.java является: -
@Dao
public interface StudentInstructorDao {
@Insert
long insertStudent(Student student);
@Insert
long[] insertStudents(Student... students);
@Insert
long insertInstructor(Instructor instructor);
@Insert
long[] insertInstructors(Instructor... instructors);
@Query("SELECT * FROM Instructor WHERE id = :instructorId")
Instructor getInstructor(long instructorId);
@Query("SELECT count() FROM Instructor JOIN student ON student.instructorId = Instructor.id WHERE Instructor.id = :instructorId" )
int getStudentCount(long instructorId);
}
Следующий код тестирования:-
mStudentInstructorDao = mDatabase.studentInstructorDao();
Instructor i1 = new Instructor();
i1.setFullNname("I1");
Instructor i2 = new Instructor();
i2.setFullNname("I2");
mStudentInstructorDao.insertInstructors(i1,i2);
Student s1 = new Student();
s1.setFirstName("S1");
s1.setLastName("LS1");
s1.setInstructorId(1);
Student s2 = new Student();
s2.setFirstName("S1");
s2.setInstructorId(1);
s2.setLastName("LS2");
mStudentInstructorDao.insertStudents(s1,s2);
NestingClass nc = new NestingClass(mStudentInstructorDao,1);
Log.d("INSTRUCTORINFO","Instructor " + nc.getInstructor().getFullNname() + " has " + nc.getStudentCount() + " Students");
Результаты при запуске в журнале, содержащем: -
2019-10-16 09:05:53.472 D/INSTRUCTORINFO: Instructor I1 has 2 Students
Альтернатива
Альтернативным подходом может быть отказ от NestingClass и иметь Instructor.class as
@Entity
public class Instructor {
@PrimaryKey(autoGenerate = true)
private long id;
private String fullNname;
public long getId(){ return id; }
public String getFullNname() { return fullNname; }
public void setId(long id){ this.id = id; }
public void setFullNname(String fullName){ this.fullNname = fullName; }
//<<<<<<<<< ADDED >>>>>>>>
public int getStudentCount(StudentInstructorDao studentInstructorDao) {
return studentInstructorDao.getStudentCount(this.id);
}
}
Использование: -
Instructor i = mStudentInstructorDao.getInstructor(1);
Log.d("STUDENTCOUNT","Instructor " + i.getFullNname() + " has " + i.getStudentCount(mStudentInstructorDao) + " Students");
приводит к (для тех же данных): -
2019-10-16 09:33:39.582 D/STUDENTCOUNT: Instructor I1 has 2 Students