У меня есть следующие сущности:
@Entity
public class CityExpert {
@Id
private long id;
@OneToOne
private User user;
@OneToMany(mappedBy = "cityExpert")
private List<CityExpertDocument> documents;
// Lots of other fields...
}
@Entity
public class CityExpertDocument {
@Id
private long id;
@ManyToOne
private CityExpert cityExpert;
// Lots of other fields...
}
@Entity
public class User {
@Id
private long id;
private String name;
private String email;
// Lots of other fields...
}
У меня есть следующий запрос HQL, в котором я выбираю подмножество CityExpert
s:
"select " +
"e " +
"from " +
"CityExpert e " +
"where " +
"( (lower(e.user.name) like concat('%', lower(?1), '%') or e.user.name is null) or ?1 = '' ) " +
"and " +
"( (lower(e.user.phone) like concat('%', lower(?2), '%') or e.user.phone is null) or ?2 = '' ) "
Однако, поскольку в CityExpert
слишком много полей, я не хочу выбирать все поля. Поэтому я изменил запрос следующим образом:
"select " +
"e.user.name, " +
"e.user.email, " +
"e.documents " +
"from " +
"CityExpert e " +
"where " +
"( (lower(e.user.name) like concat('%', lower(?1), '%') or e.user.name is null) or ?1 = '' ) " +
"and " +
"( (lower(e.user.phone) like concat('%', lower(?2), '%') or e.user.phone is null) or ?2 = '' ) "
Однако, по-видимому, мы не можем выбрать поле «один ко многим» в такой сущности, потому что я получаю MySQLSyntaxErrorException
с предыдущим запросом (см. этом вопросе). Следовательно, я изменил запрос на следующий:
"select " +
"e.user.name, " +
"e.user.email, " +
"d " +
"from " +
"CityExpert e " +
"left join " +
"e.documents d" +
"where " +
"( (lower(e.user.name) like concat('%', lower(?1), '%') or e.user.name is null) or ?1 = '' ) " +
"and " +
"( (lower(e.user.phone) like concat('%', lower(?2), '%') or e.user.phone is null) or ?2 = '' ) "
Однако на этот раз результатом становится List<Object[]>
вместо List<CityExpert>
.
Я создал следующий DTO:
public class CityExpertDTO {
private String name;
private String email;
private List<CityExpertDocument> documents;
}
Однако я не знаю, как мне сопоставить результат, возвращаемый Hibernate, с List<CityExpertDTO>
. Я имею в виду, что я могу сделать это вручную, но наверняка должно быть автоматизированное решение, предоставляемое Hibernate.
Я использую Spring Data JPA и использую HQL следующим образом:
public interface CityExpertRepository extends JpaRepository<CityExpert, Long> {
@Query(
"select " +
"e " +
"from " +
"CityExpert e " +
"where " +
"( (lower(e.user.name) like concat('%', lower(?1), '%') or e.user.name is null) or ?1 = '' ) " +
"and " +
"( (lower(e.user.phone) like concat('%', lower(?2), '%') or e.user.phone is null) or ?2 = '' ) "
)
Set<CityExpert> findUsingNameAndPhoneNumber(String name,
String phoneNumber);
}
Как я могу сопоставить результат с CityExpertDTO
?