Проблема с выводом информации
Не могу решить данную проблему уже продолжительное время, нужна помощь. С помощью запроса, который находится в service хочу вывести одно поле из таблицы Car и одно поле из таблицы Model. Данные таблицы связаны.
Если попробовать вывести информацию только из Car
Query query = session.createQuery("From Car");
то получу те поля, которые мне нужны, а вот если из связных таблиц - нет... Как исправить данную ситуацию?
Сущность Car:
package by.it.academy.entity;
import com.sun.istack.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.persistence.*;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "CAR")
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "PRICE")
@NotNull
private int price;
@Column(name = "DATE")
private int date;
@Column(name = "VIN")
@NotNull
private String VIN;
@ToString.Exclude
@JoinColumn(name = "MODEL_ID")
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
Model model;
}
Сущность Model:
package by.it.academy.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import javax.persistence.Access;
import java.util.ArrayList;
import java.util.List;
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "MODEL")
@Data
public class Model {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MODEL_ID", unique = true)
@Access(AccessType.PROPERTY)
private Long modelId;
@Column(name = "NAME")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "MARK_ID")
private Mark mark;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "MODEL_ENGINE", joinColumns = {@JoinColumn(name = "MODEL_ID")},
inverseJoinColumns = {@JoinColumn(name = "ENGINE_ID")})
private List<Engine> engines = new ArrayList<>();
@OneToOne(fetch = FetchType.LAZY, mappedBy = "model")
@javax.persistence.Access(AccessType.PROPERTY)
private Car car;
}
Jsp:
<form method="post" action="${pageContext.request.contextPath}/Car-list">
<table border="1">
<tr>
<th>price $</th>
<th>date</th>
</tr>
<c:forEach items="${modelList}" var="model">
<tr>
<td><c:out value="${model.price}"/></td>
<td><c:out value="${model.date}"/></td>
<td><input type="button" name="userName" value="заказать"/></td>
</tr>
</c:forEach>
</table> </form> </body> </html>
Сервлет:
@WebServlet(urlPatterns = "/Car-list")
@Slf4j
public class ModelListServlet extends HttpServlet {
private ModelService modelService = new ModelService();
@SneakyThrows
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException {
List<Car> avaliableCars = modelService.getAvaliableCars();
log.info("cars {}", avaliableCars);
req.setAttribute("modelList", avaliableCars);
req.getRequestDispatcher("/WEB-INF/jsp/model-list.jsp").forward(req, resp);
}
}
Ну и собственно service где находится метод:
@Override
public List<Car> getAvaliableCars() throws SQLException {
List<Car> carList = null;
Session session = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Query query = session.createQuery("select c.price, m.name from Car as c join c.model m on c.id=m.modelId");
carList = query.list();
carList.forEach(System.out::println);
session.getTransaction().commit();
} catch (HibernateException e) {
if (session != null) {
session.getTransaction().rollback();
log.info("Session was rollacked " + e);
}
} finally {
if (session != null) {
session.close();
}
}
return carList;
}