Как манипулировать объектом Data Transfer, если sql объединяет 2 таблицы? - PullRequest
1 голос
/ 25 сентября 2010

У меня есть запрос в Объект доступа к данным DAOComments, который объединяет таблицу пользователей и таблицу комментариев, а затем сохраняет результат в Объект передачи данных DTOComments:

private static final String SQL_FIND_WITH_USERNAME =
"SELECT u.username, comments.* FROM users u JOIN comments 
ON u.id = comments.id ORDER BY created_date DESC LIMIT 10;";

Тем не менее, DTOComments не имеет свойства «имя пользователя», так как это свойство DTOUsers.

Вариант 1

Поэтому я решил использовать Map<String, DTOComments>

В этом случае карта имеет username as KEY, DTOComments as VALUE.

Ноэтот подход потерпит неудачу, потому что я забочусь о ПОРЯДКЕ результата, и поэтому мой запрос возвращает результат в порядке убывания.Если я итерирую карту на странице JSP, порядок будет непоследовательным, поэтому моя страница JSP будет выводить комментарий в случайном порядке.

(Даже если порядок не имеет значения, я не знаю, может ли JSTLпокажите КЛЮЧ карты. Хотя я знаю отображение ЗНАЧЕНИЯ)

Вариант 2

Я мог бы поместить результат запроса в ArrayList<DTOComments>

Но я не знаюНе вижу места для хранения "username" сейчас.Может быть, я могу добавить новое свойство к DTOComments, например private String username;

хмм ... это нарушит концепцию наличия DTO, поскольку оно СЛЕДУЕТ отражать схему таблицы базы данных.

Опция 3

Создать новый класс, содержащий всю необходимую мне информацию (т. Е. Имя пользователя + свойства DTOComments).

Но только потому, что мне нужно еще одно свойство "username "в дополнение к свойствам DTOComments, создание нового класса кажется неправильным.

Может кто-нибудь дать мне совет, как я могу хранить всю информацию, возвращенную запросом выше, более организованным способом?

1 Ответ

1 голос
/ 25 сентября 2010

Если я выполняю итерацию карты на странице JSP, порядок не соответствует, поэтому моя страница JSP будет выводить комментарий в случайном порядке.

Такова природа HashMap. Если вы хотите сохранить порядок вставки в Map, тогда вам следует использовать LinkedHashMap. Но у подхода Map<User, Comment> есть еще один недостаток: если пользователь разместил более одного комментария, вы бы перезаписали ранее вставленный комментарий таким образом. Вместо этого вы хотели бы использовать Map<Comment, User>.

Но, имхо, лучше сделать свойство User в классе Comment, что указывает на отношение многие-к-одному:

public class Comment {
    private User user; // +getter +setter
}

Таким образом, вы можете получить List<Comment>.


Тем не менее, я хотел прокомментировать еще одно ваше заявление:

Я не знаю, может ли JSTL отображать KEY карты. Я знаю отображение ЗНАЧЕНИЯ, хотя)

Вы можете перебрать карту, используя <c:forEach>. Проходит Map#entrySet(). Каждая итерация возвращает объект Map.Entry, который в свою очередь имеет методы getKey() и getValue().

Вот начальный пример:

<c:forEach items="${map}" var="entry">
    Key: ${entry.key}, value: ${entry.value}<br>
</c:forEach>
...