Подтвердить что ты не робот

Как создать отдельный запрос в HQL

Есть ли способ создать отдельный запрос в HQL. Либо используя "отличное" ключевое слово, либо какой-либо другой метод. Я не уверен, что отличительный признак является действительным ключом для HQL, но я ищу эквивалент HQL ключевого слова SQL "отличный".

4b9b3361

Ответ 1

Вот фрагмент hql, который мы используем. (Имена изменены для защиты удостоверений)

String queryString = "select distinct f from Foo f inner join foo.bars as b" +
                " where f.creationDate >= ? and f.creationDate < ? and b.bar = ?";
        return getHibernateTemplate().find(queryString, new Object[] {startDate, endDate, bar});

Ответ 2

Стоит отметить, что ключевое слово distinct в HQL не сопоставляется непосредственно с ключевым словом distinct в SQL.

Если вы используете ключевое слово distinct в HQL, тогда Hibernate будет использовать ключевое слово distinct SQL, но в некоторых ситуациях он будет использовать трансформатор результатов для получения отличных результатов. Например, когда вы используете внешнее соединение, например:

select distinct o from Order o left join fetch o.lineItems

В этом случае невозможно отфильтровать дубликаты на уровне SQL, поэтому Hibernate использует ResultTransformer для фильтрации дубликатов после SQL-запроса.

Ответ 3

сделать что-то подобное в следующий раз

 Criteria crit = (Criteria) session.
                  createCriteria(SomeClass.class).
                  setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

 List claz = crit.list();

Ответ 4

Вы также можете использовать Criteria.DISTINCT_ROOT_ENTITY с запросом Hibernate HQL.

Пример:

Query query = getSession().createQuery("from java_pojo_name");
query.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
return query.list();

Ответ 5

У меня возникли проблемы с трансформаторами результатов в сочетании с запросами HQL. Когда я попробовал

final ResultTransformer trans = new DistinctRootEntityResultTransformer();
qry.setResultTransformer(trans);

это не сработало. Мне пришлось преобразовать вручную, как это:

final List found = trans.transformList(qry.list());

С критериями API трансформаторы работали нормально.

Ответ 6

Мой основной запрос выглядел так:

@NamedQuery(name = "getAllCentralFinancialAgencyAccountCd", 
    query = "select distinct i from CentralFinancialAgencyAccountCd i")

И я все еще не получал то, что считал "отличными" результатами. Они были просто отличными на основе комбинации первичных ключей на столе.

Итак, в DaoImpl я добавил одно изменение строки и в итоге получил "отличный" возврат, который я хотел. Например, вместо того, чтобы видеть 00 четыре раза, я просто вижу его один раз. Вот код, который я добавил в DaoImpl:

@SuppressWarnings("unchecked")
public List<CacheModelBase> getAllCodes() {

    Session session = (Session) entityManager.getDelegate();
    org.hibernate.Query q = session.getNamedQuery("getAllCentralFinancialAgencyAccountCd");
    q.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); // This is the one line I had to add to make it do a more distinct query.
    List<CacheModelBase> codes;
    codes = q.list();
    return codes;       
}

Надеюсь, это помогло! Еще раз, это может работать только в том случае, если вы следуете правилам кодирования, реализующим проект, дао и тип модели проекта.

Ответ 7

Предположим, что у вас есть объект Customer, сопоставленный с таблицей CUSTOMER_INFORMATION, и вы хотите получить список отдельных firstName клиента. Вы можете использовать ниже фрагмент, чтобы получить то же самое.

Query distinctFirstName = session.createQuery("select ci.firstName from Customer ci group by ci.firstName");
Object [] firstNamesRows = distinctFirstName.list();

Надеюсь, это поможет. Итак, мы используем группу вместо использования отдельного ключевого слова.

Также ранее мне было трудно использовать отдельное ключевое слово, когда я хочу применить его к нескольким столбцам. Например, я хочу получить список отличных firstName, lastName, тогда группа просто будет работать. В этом случае я затруднялся использовать разные слова.

Ответ 8

У меня есть ответ для языка запросов Hibernate для использования полей Distinct. Вы можете использовать * SELECT DISTINCT (TO_CITY) FROM FLIGHT_ROUTE *. Если вы используете SQL-запрос, он возвращает String List. Вы не можете использовать возвращаемое значение для класса Entity. Таким образом, ответом на решение этого типа проблемы является использование HQL с SQL.

FROM FLIGHT_ROUTE F WHERE F.ROUTE_ID IN (SELECT SF.ROUTE_ID FROM FLIGHT_ROUTE SF GROUP BY SF.TO_CITY);

Из запроса SQL запроса он получил DISTINCT ROUTE_ID и вводит в качестве списка. И IN-запрос фильтрует отдельный TO_CITY из IN (List).

Тип возврата - тип Entity Bean. Таким образом, вы можете использовать его в AJAX, таком как AutoComplement.

Все в порядке