[используя JPA, MySQL, MVC, Servlets, JSP] Если я прочитал некоторые данные из базы данных LEFT JOIN
-в трех таблицах (внутри метода объекта DAO), как мне отформатировать этот результат, поэтому я могу установить его как атрибут запроса (в сервлете) и переходите на страницу JSP?Какой формат данных подходит для передачи данных (результат запроса левого соединения db) из сервлета в JSP?
Объекты (таблицы в дБ):
Post
:
@Entity
@Table(name = "post")
public class Post implements Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "post_id", unique = true, nullable = false)
private Integer id;
@Column(name = "post_title", length=300, unique = false, nullable = false)
private String title;
@Column(name = "post_date", unique = false, nullable = false)
private Date date;
@Column(name = "post_summary", length=1000, unique = false, nullable = true)
private String summary;
@Column(name = "post_content", length=50000, unique = false, nullable = false)
private String content;
@Column(name = "post_visitors", unique = false, nullable = false)
private Integer visitors;
@ManyToOne
@JoinColumn (name = "user_id", referencedColumnName="user_id", nullable = false)
private User user;
@ManyToOne
@JoinColumn (name = "category_id", referencedColumnName="category_id", nullable = false)
private Category category;
@OneToMany(cascade = { ALL }, fetch = LAZY, mappedBy = "post")
private Set<Comment> comments = new HashSet<Comment>();
...
Entity Comment
:
@Entity
@Table(name = "comment")
public class Comment implements Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "comment_id", unique = true, nullable = false)
private Integer id;
@Column(name = "comment_title", length=300, unique = false, nullable = false)
private String title;
@Column(name = "comment_date", unique = false, nullable = false)
private Date date;
@Column(name = "comment_content", length=600, unique = false, nullable = false)
private String content;
@ManyToOne
@JoinColumn (name = "user_id", referencedColumnName="user_id", nullable = false)
private User user;
@ManyToOne
@JoinColumn (name = "post_id", referencedColumnName="post_id", nullable = false)
private Post post;
...
Сущность User
:
@Entity
@Table(name = "user")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "user_id", unique = true, nullable = false)
private Integer id;
@Column(name = "user_name", length=45, unique = false, nullable = false)
private String name; // "first_name" + ' ' + "last_name"
//URL address to user's image
@Column(name = "user_image", length=500, unique = false, nullable = true)
private String image;
@Column(name = "user_username", length=45, unique = false, nullable = false)
private String username;
@Column(name = "user_password", length=45, unique = false, nullable = false)
private String password;
...
Итак, я хотел бы сделать метод, вероятно, внутри PostDAO
объекта, который будет выглядеть примерно так:
public <SomeDataTypeFormat???> getPostsSummaries(){
Query q = em.createNativeQuery("SELECT
post_title,
post_summary,
post_date,
COUNT(comment_id) AS comment_cnt,
user.user_name
FROM
post
LEFT JOIN user USING(user_id)
LEFT JOIN comment USING(post_id)
GROUP BY
post_id
ORDER BY
comment_cnt DESC");
...
}
Метод возвращает некоторые поля из всех трех таблиц в базе данных. Нужно ли создавать отдельный класс и хранить эти данные в объектах этого класса? Или JSON (хотя я еще не работал с ним)?
Что такое практика? Какой простой формат данных использовать и пересылать из сервлета в JSP, для некоторых полей, полученных в результате соединения таблиц пары?
Так, в принципе, я должен сделать отдельный класс, который будет иметь свойства, соответствующие полям в 'resultset' запроса? 'POJO', просто геттеры и сеттеры, верно? – Vladimir
Если вы хотите «объект ценности», затем окончательные поля и просто геттеры. Если вы хотите DTO, тогда вы правы. –
Вижу, спасибо за помощь. – Vladimir