Весенние прогнозы выберите коллекцию
Я пытаюсь, чтобы проекция станции включала список связанных логотипов. Ниже мой домен:
@Table(name = "Station")
public class Station implements Serializable {
@Id
@Column(name = "Id")
private int id;
@OneToMany(cascade = CascadeType.ALL,
fetch = FetchType.LAZY,
mappedBy = "station")
private Set<Logo> logos;
}
Логотипы, связанные с @OneToMany:
@Table(name = "Logo")
public class Logo {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Transient
private String fullUrl; // calculated
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "StationId", nullable = false)
private Station station;
}
Мой репозиторий и запрос выглядит следующим образом:
@Query(value = "SELECT s.id AS Id, s.logos As Logos FROM Station s JOIN s.users su WHERE su.username = ?1")
Collection<StationListViewProjection> findStationsByUsername(String username);
Моя проекция станции ожидает идентификатор и список логотипов.
@Projection(name = "StationListViewProjection", types = Station.class)
public interface StationListViewProjection {
int getId();
Set<LogoProjection> getLogos();
}
Для логотипа проекции нужен только URL
@Projection(name = "LogoProjection", types = Logo.class)
public interface LogoProjection {
String getFullUrl();
}
Когда я выполняю свой запрос, я получаю странный ответ:
MySQLSyntaxErrorException: у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'col_5_0_, . как col_6_0_, stationlog3_.id как id1_20_0_'
1 ответ
Если я это понимаю
@Transient
private String fullUrl; // calculated
правильно, ваш fullUrl
вычисляется внутри вашего Java-кода и, что более важно, у него нет соответствующего столбца в базе данных. Вы не можете использовать это поле в проекциях напрямую. Возможно, вы сможете использовать Open Projection и указать расчет для получения fullUrl
используя @Value
аннотаций.