2010-09-24 2 views
1

У меня есть запрос в Data Access Object DAOComments, который соединяет пользователей таблицы и комментарии таблицу, а затем сохранить результат в объект передачи данных DTOComments:Как манипулировать объектом передачи данных, если sql объединяет 2 таблицы?

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).

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

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

+0

Неясно, что упорядоченность именно вы хотите. 'ORDER BY' пуст. Не могли бы вы рассказать? Вы хотите 'ORDER BY u.username, c.id' или' ORDER BY c.id'? Если первый, как вы хотите отобразить его в JSP? По идентификатору комментария или по имени пользователя, а затем комментировать ID? – BalusC

+0

Упс, заказ по созданному_дайте, поэтому я хочу, чтобы комментарий отображался в самом последнем опубликованном порядке. Я сейчас обновляюсь. –

ответ

1

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

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

Но ИМХО это лучше сделать User свойство в Comment классе, что указывает на связь многие-к-одному:

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

Таким образом, вы можете в конечном итоге с List<Comment>.


То есть, я хотел бы прокомментировать другое заявление вам:

Я не знаю, если JSTL может отображать КЛЮЧ открытой карты. Я знаю, что отображается значение VALUE)

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

Вот пример стартового:

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

Мне нравится последний подход, так как вы говорите, что комментарий класса является DTO и добавляет свойство, содержащее DTOUser ИЛИ, приведенный вами пример - это новый класс? –

+1

Нет, не создавайте новый класс. Повторно используйте существующие комментарии и классы пользователей. Они имеют четко определенные отношения в базе данных (внешний ключ, верно?), Это должно быть отражено и в модели. Кроме того, вы также можете добавить свойство 'List ' в 'User'. Вы можете заставить его лениво загружаться при первом доступе с геттером. Например, как Hibernate/JPA также делают (не слишком ли вы задумываетесь, или это просто для целей хобби/обучения? Если да, держите его тогда :)). – BalusC

+0

О, я вижу, это хорошо, что я могу добавить свойства отношения к модальному! Я делаю это для обучения/хобби, но сначала я хочу узнать правильный способ кодирования/дизайна :) Большое вам спасибо за помощь каждый раз, я очень ценю ваш ответ в глубину! –