ORMLite — вернуть элемент с максимальным идентификатором (или значением)
Вопрос
Я использую ORMLite с Android.Я хочу получить значение идентификатора объекта с идентификатором с самым высоким значением.
Я также хотел бы обобщить это до запроса одного объекта с максимальным/минимальным значением для любого произвольного поля.Какова наилучшая практика для этого?
Я понимаю, что могу выполнить необработанный запрос, но есть ли другой способ, который кому-нибудь покажется?Я представляю себе что-то похожее на предикаты при выполнении FetchRequests в CoreData на iOS.
Решение
Ваш ответ выглядит хорошо @Ben, но я решил дать дополнительную информацию потомкам:
Вы можете использовать
queryForFirst
если ты знаешь свойlimit(1)
вернет один результат.qBuilder.orderby("my_field_column_name", false); qBuilder.limit(1L); MyEntity maxEntity = myEntityDao.queryForFirst(qBuilder.prepare());
Необработанный запрос также будет работать.Он включает в себя больше объектов и проверку, но будет дешевле, если размер таблицы большой, поскольку вам не нужно упорядочивать.
qBuilder.selectRaw("MAX(my_field_column_name)"); GenericRawResults<String[]> results = myEntityDao.queryRaw(qBuilder.prepareStatementString()); String[] result = results.getResults().next(); int max = Integer.parseInt(result[0]);
Очевидно, что если бы ваш столбец был другого типа, вы бы получили другой объект из result[0]
что вам придется преобразовать в соответствующий тип в зависимости от объекта.
Другие советы
Ааа, после дальнейшего обзора документации Ormlite, похоже, я хочу что-то вроде
.QueryBuilder<MyEntity,ItsIdType> qBuilder = myEntityDao.queryBuilder();
qBuilder.orderby("my_field_column_name",false); // false for descending order
qBuilder.limit(1);
List<MyEntity> listOfOne = qBuilder.query();