Frage

Gibt es eine Möglichkeit, eine Distinct-Abfrage in HQL zu erstellen. Entweder durch das „distinct“ Schlüsselwort oder eine andere Methode verwenden. Ich bin nicht sicher, ob verschiedene gültige keywork für HQL sind, aber ich bin für den HQL-Äquivalent des SQL-Schlüsselwort „distinct“.

War es hilfreich?

Lösung

Hier ist ein Ausschnitt aus hql, die wir verwenden. (Die Namen wurden geändert Identitäten zu schützen)

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});

Andere Tipps

Es ist erwähnenswert, dass das distinct Schlüsselwort in HQL nicht direkt mit dem distinct Schlüsselwort in SQL abbildet.

Wenn Sie das distinct Stichwort in HQL verwenden, dann manchmal Hibernate das distinct SQL-Schlüsselwort verwenden, aber in manchen Situationen wird es ein Ergebnis Transformator verwenden, um unterschiedliche Ergebnisse zu produzieren. Zum Beispiel, wenn Sie eine äußere verwenden verbinden wie folgt aus:

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

Es ist nicht möglich, Duplikate in diesem Fall auf SQL-Ebene, um herauszufiltern, so Hibernate eine ResultTransformer verwendet Duplikate filtern nach die SQL-Abfrage durchgeführt wurde.

so etwas wie dies beim nächsten Mal tun

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

 List claz = crit.list();

Sie können auch Criteria.DISTINCT_ROOT_ENTITY mit Hibernate HQL Abfrage als auch verwendet werden.

Beispiel:

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

Ich hatte ein paar Probleme mit Transformatoren mit HQL-Abfragen kombiniert. Als ich versuchte,

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

es hat nicht funktioniert. Ich hatte manuell wie folgt zu transformieren:

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

Mit Criteria API Transformatoren funktionierte gut.

Meine Haupt Abfrage sah aus wie dies im Modell:

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

Und ich war immer noch nicht, was ich „distinct“ Ergebnisse betrachtet. Sie waren nur verschiedene basiert auf einer Primärtastenkombination auf dem Tisch.

So in den DaoImpl Ich habe eine eine Zeile ändern und am Ende immer das „distinct“ return ich wollte. Ein Beispiel wäre, statt 00 viermal zu sehen, wenn ich jetzt sehe es einfach. Hier ist der Code, den ich an den DaoImpl hinzugefügt:

@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;       
}

Ich hoffe, das hilft! Wieder einmal kann dies nur funktionieren, wenn Sie Codierung Praktiken folgen, die den Dienst implementieren, dao und Modellprojekttyp.

Angenommen, Sie einen Kunden Entity zu CUSTOMER_INFORMATION Tabelle zugeordnet haben und Sie mögen Liste verschiedenen Vornamen von Kunden zu bekommen. Sie können unter Snippet verwenden, um das gleiche zu bekommen.

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

Ich hoffe, es hilft. So, hier sind wir mit Gruppe statt mit Schlüsselwort distinct.

Auch vorher fand ich es schwierig, eindeutige Schlüsselwort zu verwenden, wenn ich es auf mehrere Spalten anwenden möchten. Zum Beispiel möchte ich von get Liste verschiedener Vorname, Nachname dann die Gruppe durch würde einfach arbeiten. Ich hatte Schwierigkeiten bei der Verwendung verschieden in diesem Fall.

Sie können Sie das Schlüsselwort distinct in Ihnen Kriterien Builder wie folgt aus.

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Orders> query = builder.createQuery(Orders.class);
Root<Orders> root = query.from(Orders.class);
query.distinct(true).multiselect(root.get("cust_email").as(String.class));

Und das Feld Konstruktor in Ihrer Modellklasse erstellen.

Ich habe eine Antwort für Hibernate Query Language bekam Distinct Felder zu verwenden. Sie können * distinct (TO_CITY) FROM FLIGHT_ROUTE * verwenden SELECT. Wenn Sie SQL Abfrage zurückgeben String-Liste. Sie können es nicht Wert von Entity-Klasse verwenden zurückgeben. So ist die Antwort zu lösen diese Art von Problem ist die Verwendung HQL mit SQL .

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

Von SQL Abfrage-Anweisung es DISTINCT ROUTE_ID und Eingang als Liste bekommt. Und IN Abfrage filtert, um die unterschiedliche TO_CITY von IN (List).

Rückgabetyp ist Entity Bean-Typ. So kann man es in AJAX wie AutoComplement .

alle Mai OK

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top