Мне было интересно, кто-нибудь может дать отзыв о паттерне, с которым я сейчас играю? Это предполагает наличие сущности, реализующей интерфейс DTO, который также используется (как проекция) в интерфейсе JpaRepository - для той же сущности - для возврата результатов запроса с конкретными столбцами. Интерфейс DTO также имеет методы по умолчанию, позволяющие любому экземпляру объекта и прокси-серверу DTO вести себя одинаково.
На вопросы, на которые я хочу ответить, есть ли у этого шаблона какие-либо недостатки, такие как производительность, которые могут помешать его использованию в работе. Мне также интересно услышать, как другие запрашивают определенные поля данных, используя JpaRepositories. Ниже приведен пример кода, который иллюстрирует шаблон, с которым я играю.
public interface InstructorDTO {
String getFirstName();
String getLastName();
default String getFullName() {
return getFirstName() + ' ' + getLastName();
}
}
@Entity
public class Instructor implements InstructorDTO {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private int id;
@Column(name="first_name")
private String firstName;
@Column(name="last_name")
private String lastName;
@Column(unique = true)
private String email;
@Override
public String getFirstName() {
return this.firstName;
}
@Override
public String getLastName() {
return this.lastName;
}
...remaining getters and setters
}
@Repository
public interface InstructorRepository extends JpaRepository<Instructor, Integer> {
<S> S findById(int id, Class<S> type);
<T> Collection<T> findByEmail(String email, Class<T> type);
}
public class SomeClass {
@Autowired
InstructorRepository instructorRepository;
public void someMethod {
int id = 1;
// Returns proxy
InstructorDTO instructor1 = instructorRepository.findById(id, InstructorDTO.class);
// Returns Instructor Object
Instructor instructor2 = instructorRepository.findOne(id);
System.out.println(instructor1.getFullName()); // returns John Doe
System.out.println(instructor2.getFullName()); // returns John Doe
}
}