#java #ebean
#java #ebean
Вопрос:
Я создаю select, который должен получать мне все различные значения из таблицы.
SQL, который я обычно пишу, будет выглядеть следующим образом: "SELECT DISTINCT ARTIST FROM MUSICLIB"
Однако ebean генерирует следующее: "SELECT DISTINCT ID, ARTIST FROM MUSICLIB"
Поисковик как таковой:
find.select("artist").setDistinct(true).findList();
Я обнаружил, что ebean генерирует этот идентификатор в каждом отдельном запросе, независимо от того, какие параметры я установил.
Как мне выполнить то, что я ищу?
Комментарии:
1. Обновление: Эта проблема была исправлена в версии 4.2.0 согласно github.com/ebean-orm/avaje-ebeanorm/issues/158
Ответ №1:
Вы не можете этого сделать, Ebean для сопоставления объектов требует поля ID, и если вы не включите его, вы получите некоторые загадочные исключения.
Вместо этого вы можете запросить DB без сопоставления, а затем написать свой оператор SQL самостоятельно:
SqlQuery sqlQuery = Ebean.createSqlQuery("SELECT DISTINCT artist FROM musiclib");
List<SqlRow> rows = sqlQuery.findList();
for (SqlRow row : rows) {
debug("I got one: " row.getString("artist"));
}
Конечно, если artist
это отношение, вам нужно выполнить дополнительный запрос, используя список найденных идентификаторов с in(...)
выражением.
Комментарии:
1. Тогда хорошо, но вслед за этим, что насчет того, когда ebean генерирует имена таблиц с префиксами, и мы не можем их просмотреть при удаленной установке? Я наткнулся на ответ, который вы уже дали, но теперь имена таблиц являются проблемой, поскольку они могут быть сгенерированы по-разному в разных DB, в зависимости от того, что хочет клиент. Я нашел кое-что о NamingConvention из Ebean ServerConfig, но это возвращает null. Должен ли я задать отдельный вопрос по этому поводу?
2. Как вы устанавливаете префиксы таблицы?
3. Тем временем я создал этот отчет об ошибке: github.com/ebean-orm/avaje-ebeanorm/issues/158
4. О префиксах: этого я не знаю. Я предполагаю, что это то, на что способен ebean, и что некоторые клиенты могут захотеть для всех своих таблиц.
5. TBH Я всегда требую от своих клиентов ПУСТЫЕ базы данных, поэтому нет необходимости в дополнительном префиксе, в таком случае tablename никогда не изменится 🙂 вы можете, например, добавить свойство конфигурации в вашем application.conf для префикса таблицы, чтобы вы могли прочитать его и использовать префикс tablename в пользовательских запросах.