Я хочу реализовать отображение DTO после выполнения SQL-запроса с помощью SQL JOIN:
Запрос:
public List<Businesses> findCompaniesBusinessesById(Integer id) {
String hql = "SELECT bus FROM " + Businesses.class.getName() + " bus "
+ " INNER JOIN " + Companies.class.getName() + " comp "
+ " ON comp.id = bus.company_id "
+ " WHERE bus.business_owner_id = :id "
+ " AND bus.business_owner_type = 'Merchant' "
+ " ORDER BY bus.id ASC";
TypedQuery<Businesses> query = entityManager.createQuery(hql, Businesses.class).setParameter("id", id);
List<Businesses> businesses = query.getResultList();
return businesses;
}
Юридические лица:
@Entity
@Table(name = "companies")
public class Companies implements Serializable {
@Id
@Column(name = "id", unique = true, updatable = false, nullable = false)
private int id;
@Column(length = 255)
private String name;
@Column
@Convert(converter = LocalDateTimeConverter.class)
private LocalDateTime created_at;
@Column
@Convert(converter = LocalDateTimeConverter.class)
private LocalDateTime updated_at;
...
}
Юридические лица:
@Entity
@Table(name = "businesses")
public class Businesses {
@Id
@Column(name = "id", unique = true, updatable = false, nullable = false)
private int id;
@Column(length = 4)
private Integer business_owner_id;
@Column(length = 255)
private String business_owner_type;
@Column(length = 4)
private Integer company_id;
@Column
@Convert(converter = LocalDateTimeConverter.class)
private LocalDateTime created_at;
@Column
@Convert(converter = LocalDateTimeConverter.class)
private LocalDateTime updated_at;
.......
}
! ПРИМЕЧАНИЕ! В сущности Бизнес у нас нет атрибута name
по дизайну.
DTO:
public class BusinessesDTO {
private Integer id;
private String name;
.......
}
! ПРИМЕЧАНИЕ! В BusDisDTO мы рассчитываем name
от замысла и хотим отобразить его.
DTO Mapping:
@Mapper(config = BaseMapperConfig.class)
public interface BusinessesMapper {
BusinessesDTO toDTO(Businesses company);
.....
}
Результат запроса при его выполнении вручную:
SELECT * FROM businesses bus
INNER JOIN companies comp
ON comp.id = bus.company_id
WHERE bus.business_owner_id = 1
AND bus.business_owner_type = 'Merchant'
ORDER BY bus.id ASC
Как видите, есть имя столбца.
Я пытался использовать этот код, чтобы получить отображение:
@Autowired
private BusinessesMapper businesses_mapper;
List<BusinessesDTO> list = null;
try {
list = StreamSupport.stream(merchantService.findCompaniesBusinessesById(id).spliterator(), false)
.map(businesses_mapper::toDTO)
.collect(Collectors.toList());
} catch (Exception e) {
e.printStackTrace();
}
String joinedList = list.stream()
.map(BusinessesDTO::getName)
.collect(Collectors.joining(", "));
Но за результат я получаю NULL. По какой-то причине имя не отображается правильно, и я не могу найти, почему.
Возможно ли не иметь атрибут name
в сущности Businesses
и отобразить поле name
, существующее в запросе SQL, с помощью DTO.
Из картинки SQL-запроса я правильно понимаю имя, как вы можете видеть выше. Можете ли вы дать мне представление, где я не прав?