Чистый / прямой подход должен выглядеть примерно так:
SELECT Client, Option, GROUP_CONCAT(Dish SEPARATOR ', ')
FROM table_name
GROUP BY Client, Option
Затем, когда ваши данные уже сгруппированы и склеены, просто напечатайте свои строки в одном цикле набора результатов.
Использование do {} while ()
здесь бесполезно.
Вот непроверенный фрагмент ...
if ($conmenu) {
echo '';
echo 'Client Option Dishes ';
while ($row = mysqli_fetch_assoc($conmenu)) {
echo '' , implode(' ', $row) , ' ';
}
echo '
';
}
Для записи:
Максимально допустимая длина результата в байтах для функции GROUP_CONCAT (). По умолчанию установлено значение 1024.
blockquote>https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_group_concat_max_len
Также [116 ] является итеративным, поэтому вы можете использовать foreach вместо цикла while.
foreach ($conmenu as $row) { ...
Если вы хотите сделать это трудным путем ...
SELECT Client, Option, Dish FROM table_name ORDER BY Client, Option
Тогда ... (не проверено)
if ($conmenu) { echo '
'; echo '
'; }'; $group = null; foreach ($conmenu as $row) { if ($group !== $row['Client'] . '_' . $row['Option']) { if ($group !== null) { echo ''; } echo ' Client Option Dishes '; // close final iteration echo ' ' , implode(' ', $row); } else { echo ", " , $row['Dish']; } $group = $row['Client'] . '_' . $row['Option']; // update group } echo '
Вы можете написать модульный тест для заполнения базы данных, используя JPA и простую Java. Этот тест будет вызван Maven как часть стандартного жизненного цикла сборки. В результате вы получите полностью инициализированную базу данных, используя Maven, JPA и Java в соответствии с запросом.
Я хотел бы использовать для этого синглтон-бин:
import javax.annotation.PostConstruct;
import javax.ejb.Startup;
import javax.ejb.Singleton;
@Singleton
@Startup
public class InitData {
@PostConstruct
public void load() {
// Load your data here.
}
}
Зависит от вашей БД. Лучше иметь сценарий для настройки db
Вы можете создавать объекты JPA в чистом классе Java и сохранять их. Этот класс может вызываться сервлетом, но также иметь метод main
и вызываться из командной строки с помощью maven (с помощью подключаемого модуля Exec Maven) или даже в виде оболочки как подключаемый модуль Maven.
Но ваш финальный рабочий процесс не ясен (вы хотите, чтобы инициализация была частью запуска приложения или выполнялась во время сборки?) И требует некоторых пояснений.
Я не уверен, что вы сможете отказаться от использования некоторого SQL. Это будет зависеть от того, работают ли ваши разработчики с пустой базой данных без определенной схемы или таблицы есть, но они пусты.
Если вы начинаете с пустых таблиц, вы можете использовать подход Java для генерации данных. Я не так хорошо знаком с Maven, но предполагаю, что вы можете создать некоторую задачу, которая будет использовать ваши классы DAO для генерации данных. Вы, вероятно, даже могли бы написать его, используя язык сценариев на основе JVM, такой как Groovy, который мог бы напрямую использовать ваши классы DAO. У вас будет аналогичная задача, которая очистит данные из таблиц. Тогда ваши разработчики просто запустят эти задачи в командной строке или в своей среде IDE в качестве ручного шага после оформления заказа.
Если у вас есть свежий экземпляр базы данных, я думаю, вам нужно будет выполнить некоторый SQL просто для создания схемы. Технически вы могли бы сделать это, выполняя вызовы SQL в спящем режиме, но на самом деле это того не стоит.
Обычный способ сделать это - использовать сценарий SQL. Затем вы запускаете специальный файл bash, который заполняет базу данных с помощью вашего .sql
Если вы хотите иметь возможность программно настроить свою базу данных во время запуска WebApp, вы можете использовать прослушиватель веб-контекста .
Во время инициализации вашего веб-контекста вы можете использовать прослушиватель контекста сервлета, чтобы получить доступ к вашему DAO (уровень сервиса ... что угодно), создать ваши сущности и сохранить их, как вы это делаете в своем java-коде
p.s. в качестве справки Жизненный цикл сервлета
Если вы используете Spring, вам следует взглянуть на раздел справочника Стандартные и настраиваемые события . Это лучший способ реализовать Spring Listener, который знает о контексте Spring (в случае, если вам нужно получить из него свои службы)
ServletContextListener
или в общее место запуска поместите весь предстоящий кодWebApplicationContextUtils.getRequiredWebApplicationContext().getBean(...)
), перебрать все предопределенные объекты и персистировать их через EntityManager
в базу данных.