Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×

Як витягнути останній запис з таблиці Mysql використовуючи Hibernate

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Привіт усім! Необхідно витягнути останній доданий запис з таблиці використовуючи Hibernate і надіслати дані на jsp, для цього використовую наступний код:

public class CabinetController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest hsr,
HttpServletResponse hsr1) throws Exception {
ModelAndView mv = new ModelAndView("kabinet“);
String out = “Výpis uživatelů: ”;
try {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
List result = session.createQuery("from Kabinet ORDER BY id desc 1").list();
mv.addObject("kor", result);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
}
mv.addObject("message", out);
return mv;
}

Табличка виводиться в правильному порядку(останній доданий запис розташований на першому місці), але виводиться уся таблиця, а мені потрібно лише 1 запис.

Використовував ще такий спосіб:

Query result = session.createQuery("from Kabinet ORDER BY id desc 1").setMaxResults(0);

але виводить таке виключення:

xception

javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Don’t know how to iterate over supplied “items” in <forEach>

root cause

javax.servlet.jsp.JspTagException: Don’t know how to iterate over supplied “items” in <forEach>

достатньо довго сиджу над даною проблемою........Буду вдячний за будь яку допомогу!!!

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Технический вопрос на доу? Разбудите меня

Я заметил, что к техническим вопросам склонны пользователи с волками на аватарках:
dou.ua/...iy-kikh/topics
dou.ua/...usigora/topics

1. заключай код или любой, в котором нужно сохранить пробелы в тег pre || code
2. гугли
www.coderanch.com/...ed-ID-hibernate

Session session = getHibernateSessionFromSomewhere();
Car car = new Car();
session.save(car);
String carIdBeforeFlush = car.getId(); // returns null
session.flush(); // I forgot this from the previous post
String carIdAfterFlush = car.getId(); // returns the id Hibernate assigned for your car
forum.hibernate.org/...hp?f=1&t=965109
....
www.google.com/... last insert id
.
или на крайний случай сделай все через БД
docs.jboss.org/...l/querysql.html
.
Когда решишь задачу — напиши решение и добавь в название топика [РЕШЕНО]

Вы можете расшарить свой проект на git ? или любую другую VCS ?

достатньо довго сиджу над даною проблемою........Буду вдячний за будь яку допомогу!!!
частина курсача тільки укр.
Ходи на занятия, грызи гранит науки.

там гризуть тільки гаманці, сам хочу зробити

сам хочу зробити
И для этого здесь открыл тему. Сделай сам. Тебе же будет полезнее.

Можете сделать так:

List result = session.createQuery("from Kabinet ORDER BY id desc 1").list();
Object obj = session.createQuery("from Kabinet ORDER BY id desc 1").list().get(0);

Кроме этого можно написать запрос на SQL используя LIMIT или использовать CallableStatement или NamedQuery.

List result = session.createQuery("from Kabinet ORDER BY id desc 1").list();
виводить цілу таблицю
Object obj = session.createQuery("from Kabinet ORDER BY id desc 1").list().get(0);

виводить exception

javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Don’t know how to iterate over supplied “items” in <forEach>

Ну так у вас же получается ошибка в jsp

<c:foreach items="${kor}" var="kabinet">
Чему равен
Object obj
И можно ли его использовать в контесте foreach?

То есть думаю там просто в исходном коде не нужно делать get(0), а достоточно поставить setMaxResult(1).

якщо поставити

setMaxResult(1).
отримую exeption

я ниже писал что ошибка на странице в тагах.

Object obj нужно скастить к типу объекта полученого с базы. Можно и гет(0) и максРезалт. Разницы для него нет так как это похоже на лабораторную польского ВУЗа...

частина курсача тільки укр.

С этого и начинать стоит. Понятно почему вменяемые решения вас не заинтересовали.

jsp

<c:foreach items="${kor}" var="kabinet">

<c:out value="${kabinet.vik}"></c:out>
<c:out value="${kabinet.vaga}"></c:out>
<c:out value="${kabinet.temperatura}"></c:out>
<c:out value="${kabinet.stat}"></c:out>
<c:out value="${kabinet.duxanny}"></c:out>
<c:out value="${kabinet.puls}"></c:out>
<c:out value="${kabinet.tuskV}"></c:out>
<c:out value="${kabinet.tuskN}"></c:out>

</c:foreach>

А kor каким образом устанавливается?

В начальном варианте было же
List result = session.createQuery("from Kabinet ORDER BY id desc 1").list();
mv.addObject("kor", result);
без obj.
То есть получается нужно вставить setMaxResults(1) чтобы выводил только 1 результат.
Или тогда уже убрать foreach из Jsp и использовать kor как объект.

убрать foreach из Jsp и использовать kor как объект.
 як це зробити?

обратиться к объекту прямо на сервлете или в своем бине или чем вы выталкиваете на JSP.
Поставить breakpoint прямо на mv.addObject...... или сделать банальный System.out.println(result) если не получится.

ну ты же в модель засовываешь как kor, значит обращайся через kor:

<c:out value="${kor.vik}"></c:out>
<c:out value="${kor.vaga}"></c:out>
<c:out value="${kor.temperatura}"></c:out>
<c:out value="${kor.stat}"></c:out>
<c:out value="${kor.duxanny}"></c:out>
<c:out value="${kor.puls}"></c:out>
<c:out value="${kor.tuskV}"></c:out>
<c:out value="${kor.tuskN}"></c:out>

list() замініть на uniqueResult(), get(0) — не треба. Будьте готові, що якщо елемента немае — поверне null. Це можна перевірити і замінити пустим списком.

Якщо вже по нормальному не виходить...

limit 1 в HQL нет, там есть setMaxResults(). ТСу нужно было на HQL решение хотя у него ошибка на странице была ))))

Если ID auto_increment, то можно так: SELECT * FROM tablename WHERE id=LAST_INSERT_ID();

А потом он добавит условие и будет дебажить опять.

В конце запроса добавь limit 1

пробував, результату не дало

SELECT *
FROM tablename
ORDER BY ID DESC
LIMIT 1
И без ормов, ручками попробуйте

Может я что-то перепутал, но limit в HQL нету, нужно setMaxResults. У ТСа ошибка в другом месте, а он бъется лбом именно в ограничение до одного.

Еще как вариант можно было бы в дебаг логах посмотреть на запрос SQL к самому MySQL. И если запрос правильный и содержит limit 1, то посмотреть, уважает ли эту директиву конкретная конфигурация MySQL. Например его можно просто выполнить руками и посмотреть

1. Взять и подключится напрямую и сформировать правильный SQL запрос — для того, чтобы увидеть что там.
2. И уже после этого любить гибернейт.
upd: прикольно, правите коменты на основе ответов на них) ...

Кроме HQL ты можешь написать запрос еще стандартным SQL или Criteria API. В чём проблема написать селект ололо фром трололо ордер бай лимит 1?

Я бы написал уже его давно как угодно. ТС говорит «не работает» и внятно не отвечает что падает, что в логах, что получается в ответ на советы

ошибка в тагах на странице у него)

Воно впало чи результат такий самий?

1. Впало — це принаймні щось

2. Не впало?!? У вас виконується не той запит, limit не підтримується HQL. Для перевірки напишіть в строку запиту абракадабру

напрямку запит виконується правильно

Вот поэтому и не надо пользоваться ормами.

потому что до сих пор не научились работать с ними? весомый аргумент.

Вы придумали для себя аргумент и назвали его весомым. Это ваше дело. Но зачем вы об этом пишете?

а как без сарказма? когда предлагают отказаться от автоматизированного конвеера в пользу гаечного ключа в эпоху самолетостроения.

Если

без сарказм
то вам следует удалить фразу
отказаться от автоматизированного конвеера в пользу гаечного ключа в эпоху самолетостроения

ручками все делаете на JDBC ?
хотелось бы посмотреть на ваш спагетти-кодпроект.

А я соглашусь. И вот по каким причинам:
1. Создается стойкое впечатление, что они были придуманы изначально как костыли для тех, кто не осилил выучить SQL в минимально-достаточном объеме. Типа MS Access или MS же навеска над MSSQL где кубики тягать (никто не пользуется).
2. Отладка (видно из топика) это просто лютый пинцет. К особенностям СУБД добавляем чудеса JDBC/ODBC/etc и умножаем на кучу вариантов глюков самого ОРМа.
3. Зачастую весьма кривая трансляция в запросы СУБД. Пример — табличка на 100000000+ записей, выбираем ОРМ-ом первую функцией. Угадайте — запрос на сколько записей уйдет в СУБД? А если там лок на select?
4. Абстрагировать их от конкретных СУБД не получается все равно. Так какой тогда смысл?

Было уже сказано кучу раз все это — и много других, даже более весомых причин.
dou.ua/...ic/8827/#405245
dou.ua/...ic/8827/#405502
dou.ua/...ic/8801/#403332
dou.ua/...ic/7444/#407246
dou.ua/...ums/topic/4245
Сорри за самоцитирование.

Эта вся аргументация была уместна лет 5 назад. строготипизированная логика работы с базой это сходу преимущество перед слаботипизированным непонятно чем, при структуризации доменной логики, командной работе с кодом и рефакторинге. Сиквел селект это отнюдь не конечный инструмент контроля того как производительно ваша субд считает данные с диска. При написании кода транслируемого в запросы включаем трасировку и крутим вертим как угодно любой строготипизированный код до желаемого вида транслируемого в сиквел. Это я уже молчу про последние тенденции связанные с мв* приложениями и протоколами работы Апи , которые максимально рассчитаны на работу с орм.

И? Что-то протворечащее или просто лижбы запостить?

и шо?
вы правильный объект выталкиваете на jsp?

ось код

<th>Вік</th>
<th>Вага</th>
<th>Темп тіла</th>
<th>Стать</th>
<th>Дихання</th>
<th>Пульс</th>
<th>Тиск верх</th>
<th>Тиск низ</th>

<c:foreach items="${kor}" var="kabinet">

</c:foreach>

<c:out value="${kabinet.vik}"></c:out><c:out value="${kabinet.vaga}"></c:out><c:out value="${kabinet.temperatura}"></c:out><c:out value="${kabinet.stat}"></c:out><c:out value="${kabinet.duxanny}"></c:out><c:out value="${kabinet.puls}"></c:out><c:out value="${kabinet.tuskV}"></c:out><c:out value="${kabinet.tuskN}"></c:out>

за назви полів прошу не кричати(не я таб створював)

Підписатись на коментарі