Dejo mi solucion:
- Modificacion de la tabla viewed para incorporar el campo fechahora. Es aconsejable evitar usar nombres reservados como datetime, timestamp, son propios de las Bases de datos, y pueden causar problemas
He creado de tipo DATETIME y he puesto not null y que se le asigne un valor por defecto de fecha actual, con esto no es necesario cambiar el insert de viewed en el codigo
ALTER TABLE `viewed` ADD `fecha_viewed` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `id_user`;
- En la clase DataBase se ha agregado la constante de acuerdo al nombre del campo en mi caso:
public static final String TVIEWED_FECHAVIEWED = "fecha_viewed";
- En la clase MovieDAO he sobrecargado el metodo read para pasar una fecha, notar que se requiere los vistos de una fecha por eso funciona una consulta directa con JOIN, solo se mostraran los libros vistos de acuerdo a la fecha:
default ArrayList<Movie> read(Date date) {
ArrayList<Movie> movies = new ArrayList<Movie>();
java.sql.Date dt = new java.sql.Date(date.getTime());
/*SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String dateString = df.format(date);*/
try (Connection connection = connecToDB()) {
String query = "SELECT * FROM " + TMOVIE + " INNER JOIN " + TVIEWED +
" ON (" + TMOVIE + "." + TMOVIE_ID + " = " + TVIEWED + "." + TVIEWED_IDELEMENT + ")" +
" WHERE " + TVIEWED + "." + TVIEWED_IDMATERIAL + " = ? " +
" AND "+ TVIEWED + "." + TVIEWED_IDUSUARIO + " = ?" +
" AND DATE(" + TVIEWED + "." + TVIEWED_FECHAVIEWED + ") = ?";
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setInt(1, ID_TMATERIALS[0]);
preparedStatement.setInt(2, TUSER_IDUSUARIO);
preparedStatement.setDate(3, dt);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
Movie movie = new Movie(rs.getString(TMOVIE_TITLE), rs.getString(TMOVIE_GENRE),
rs.getString(TMOVIE_CREATOR), rs.getInt(TMOVIE_DURATION), rs.getShort(TMOVIE_YEAR));
movie.setId(rs.getInt(TMOVIE_ID));
movie.setViewed(true);
movies.add(movie);
}
} catch (SQLException e) {
// TODO: handle exception
}
return movies;
}```
Hay que notar algunas cosas:
- Es aconsejable anidar en el query los valores de parametros, si no mas bien hacerlo como lo hace ann mediante "?" para evitar SQLInjection
INCORRECTO
TVIEWED + “.” + TVIEWED_IDUSUARIO + " = " + TUSER_IDUSUARIO
CORRECTO
TVIEWED + “.” + TVIEWED_IDUSUARIO + " = ?"
preparedStatement.setInt(1, TUSER_IDUSUARIO);
- Otra cosa en el codigo manejamos por Date pero es de tipo java.util.Date pero el JDBC usa el tipo java.sql.Date que no es lo mismo por lo cual se procede a realizar la conversion.
java.sql.Date dt = new java.sql.Date(date.getTime());
Para usar el parametro asi
preparedStatement.setDate(3, dt);
- Y una tercera ya no es necesario poner el siguiente codigo
movie.setViewed(getMovieViewed(preparedStatement, connection, rs.getInt(TMOVIE_ID)));
Como se pide solo los vistos, siempre sera true
movie.setViewed(true);
4. En la clase Movie se ha sobrecargado el metodo para pasar el filtro de fecha
public static ArrayList<Movie> makeMoviesList(Date date) {
Movie movie = new Movie();
return movie.read(date);
}
5. En la clase Main se ha llamado al metodo anterior para consultar las peliculas de acuerdo al filtro
movies = Movie.makeMoviesList(date);
Quedando de esta manera
public static void makeReport(Date date) {
SimpleDateFormat df = new SimpleDateFormat(“yyyy-MM-dd-h-m-s-S”);
String dateString = df.format(date);
Report report = new Report();
report.setNameFile("reporte" + dateString);
report.setExtension("txt");
report.setTitle(":: VISTOS ::");
SimpleDateFormat dfNameDays = new SimpleDateFormat("E,dd MMM Y");
dateString = dfNameDays.format(date);
String contentReport = "Date: " + dateString + "\n\n\n";
movies = Movie.makeMoviesList(date);
for (Movie movie : movies) {
if (movie.getIsViewed()) {
contentReport += movie.toString() + "\n";
}
}
for (Serie serie : series) {
ArrayList<Chapter> chapters = serie.getChapters();
for (Chapter chapter : chapters) {
if (chapter.getIsViewed()) {
contentReport += chapter.toString() + "\n";
}
}
}
for (Book book : books) {
if (book.getIsReaded()) {
contentReport += book.toString() + "\n";
}
}
report.setContent(contentReport);
report.makeReport();
System.out.println("Reporte Generado");
System.out.println();
}```
Con esto logramos imprimir el reporte de las peliculas vistas de hoy
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?