powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / query в JDO
12 сообщений из 12, страница 1 из 1
query в JDO
    #33095801
vixen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ситуация такая : в запросе из базы гружу к себе в лист все записи определённой таблицы , но так получилось что в таблице сцепленный ключ, а поле, являющееся второй частью ключа меня не интересует и не выводится, и в итоге у меня получается куча дублирующихся записей . В SQL всё просто решается distinctом .
Вопрос : Есть ли аналог слова distinct в JDO?
или как-то можно сделать через QueryOptionConstants?
...
Рейтинг: 0 / 0
query в JDO
    #33095950
baza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не совсем понятно при чем тут JDO, если Вы работаете с РСУБД напрямую (?)
...
Рейтинг: 0 / 0
query в JDO
    #33095970
vixen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
работаю в eclipse
такой вот кусок кода :

public List searchAgentByName(String agentName)
{
QueryOptions qo = new QueryOptions();
qo.addOption(QueryOptionConstants.QUERY_ORDERING, "agentName ascending");
if(agentName.equals("*"))
return search("",qo);
}

если в фильтр пишу :
search("distinct agentName,ID",qo);
никак не реагирует, то есть возвращает всё и дублицированные записи
...
Рейтинг: 0 / 0
query в JDO
    #33095992
baza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В JDO есть некоторые агрегатные функции, но distinct, по-моему нет...

Я делаю в JDO так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Query query= null ;
 if  (agentName.equals("*")) {
query=persistenceManager.newQuery(Agent. class );
Collection res=query.execute();
}
 else  {
query=persistenceManager.newQuery(Agent. class ,"this.agentName==an");
query.setParameters("String an");
query.setOrdering("this.agentName ascending");
Collection res=query.execute(agentName);
}
...
Рейтинг: 0 / 0
query в JDO
    #33096008
vixen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проблема не в том что запрос не работает , он работает и делает то что говорят, только я неправильно ему говорю ))
мне надо именно distinct как то ему объяснить )
среда агрегатных функций distinct нет так как это не функция
вопрос остаётся : Есть ли аналог слова distinct в JDO?
спасибо BaZa!
...
Рейтинг: 0 / 0
query в JDO
    #33096936
Alexey Rovdo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне кажется проблему можно решить через использование группировки.
В JDO 2 введены свойства группирования. Это может выглядеть примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Query query= null ;
 if  (agentName.equals("*")) {
query=persistenceManager.newQuery(Agent. class );
Collection res=query.execute();
}
 else  {
query=persistenceManager.newQuery(Agent. class ,"this.agentName==an");
query.setParameters("String an");
q.setGrouping("this.agentName");
query.setOrdering("this.agentName ascending");
Collection res=query.execute(agentName);
}

См также здесь .
...
Рейтинг: 0 / 0
query в JDO
    #33096997
baza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, смотрим в спецификацию JDO 2:

Specifying the Result of a Query (Projections, Aggregates)

The application might want to get results from a query that are not instances of the candidate class. The results might be fields of persistent instances, instances of classes other than the candidate class, or aggregates of fields.

Код: plaintext
 void  setResult(String result);

The result parameter consists of the optional keyword distinct followed by a commaseparated list of named result expressions.

Оно?

P.S. А какая у Вас релизация JDO?

2_Alexey

А как же быть с ID? (distinct agentName,ID)
...
Рейтинг: 0 / 0
query в JDO
    #33097469
Alexey Rovdo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BaZa
А как же быть с ID? (distinct agentName,ID)

Так и написать
setGrouping("agentName, ID");

Собственно все, что написано в этом параметре попадает в дескриптор "GROUP BY ..." при генерации SQL-кода. Здесь же можно вписать и дескриптор "HAVING ...". Я привел ссылку, по которой можно найти примеры для Versant JDO.
...
Рейтинг: 0 / 0
query в JDO
    #33097637
vixen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
группировка
qo.addOption(QueryOptionConstants.QUERY_GROUPING, "ID,agentName");
приводит только к тому что дублицированные записи выводятся вместе (если не было ordering)
пытаюсь использовать следующее :
PersistenceManager pm = null;
KodoQuery q = (KodoQuery)pm.newQuery (Agent.class);
q.setFilter("");
q.setResult ("distinct ID,agentName");
q.setOrdering("ID ascending");
agent = (List)q.execute ();
но что-то не сильно получается, а точнее NullPointerExсeption,наверно из-за pm
2Baza - jdo 1.0.2
...
Рейтинг: 0 / 0
query в JDO
    #33097682
baza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как я понял, используется Kodo JDO. Когда я ее смотрел, то мне она не понравилась.

Что касается вашей проблемы - необходимо использовать что-то типа VOA JDO, т.е. продукт реализующий JDO 2 (появляется больше возможностей для таких выборок). Как именно, я уже писал ранее.

2 Alexey

Нужно не группировать, а убрать дублирование...
...
Рейтинг: 0 / 0
query в JDO
    #33097728
Alexey Rovdo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то у вас с используемой реализацией JDO не так. Возможно слишком старая версия. Так, к примеру, привожу выдержку из документации по последней версии 3.3.3 Kodo JDO:


Now we have our subtitle data, but we're faced with a new problem: a lot of subtitles start with the same 3 characters, and we really only want to process each string once. Luckily, JDO has a built-in solution. If you begin a result string with the distinct keyword, JDO filters out duplicates. This applies not only to simple projections as in this example, but to complex projections consisting of multiple return values, including persistent object values.

Example 11.16. Distinct Projection

Query query = pm.newQuery (Magazine.class, "price < 5 "
+ "&& coverArticle.subtitles.contains (ttl)");
query.setResult ("distinct ttl.substring (0, 3)");
Collection ttls = (Collection) query.execute ();
for (Iterator itr = ttls.iterator (); itr.hasNext ();)
processSubtitle ((String) itr.next ());
query.close (ttls);

Note
Some object-relational mapping products require you to alter your query to circumvent duplicate results caused by relational joins. In the simple case, this may only involve using a SELECT DISTINCT equivalent. But in the complex case, such as with aggregate data, you might need to tell the implementation to use subselects and other complicated workarounds to avoid the relational joins problem.

This is not the case in JDO. JDO implementations always automatically eliminate duplicates caused by relational joins. You only need to use the distinct keyword in your JDO result string when there are repeated values in the database that you'd like to filter out.
...
Рейтинг: 0 / 0
query в JDO
    #33098286
vixen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
видно у меня действительно что-то с JDO .
всем большое спасибо за помощь!
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / query в JDO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]