CriteriaBuilder: Werte übergeben

Smoothi

Bekanntes Mitglied
Wie kann ich beim CriteriaBuilder Parameter übergeben.... speziell Listen

Bisher sieht es so aus:
Code:
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Device> q = cb.createQuery(Device.class);
        
        // Auswahl
        Root device = q.from(Device.class);
        q.select(device);

        // Not Member Of
        Expression<List<Device>> deviceList = fisPoint.getDevices();
        q.where(cb.isMember(device, deviceList));
        
        // Sortierung
        q.orderBy(cb.asc(device.get("serial")));
        
        // Query erstellen
        return em.createQuery(q).getResultList();

Problem ist folgendes:
Code:
Expression<List<Device>> deviceList = fisPoint.getDevices();
q.where(cb.isNotMember(device, deviceList));

.getDevices ist eine List<Device> bzw. LinkedList<Device>

wie kann ich das machen? ;) Natürlich ohne Cast-Experimente ;)

Falls es Unterschiede gibt, wäre es auch Klasse eine Lösugn für einfache Werte, also zum Beispiel ein Device, zu übergeben. ;)
 
Zuletzt bearbeitet:

Smoothi

Bekanntes Mitglied
Es wird wahrscheinlich wieder klappen, wenn ich .createQuery.setParameter(...) mach, aber genau das möchte ich vermeiden, da ich nicht immer alle Parameter benutze

und das lässt sich dann nur lösen indem ich zusätzliche Codeabfragen nach createQuery() erstelle oder solchen Schwachsinn wie ".where(cb.NotEquals(Parameter, Parameter))" oder so einfüge, damit der Parameter benutzt wird.....
 
Zuletzt bearbeitet:
S

SlaterB

Gast
verwende doch Java-Tags mit 56 Postings..

was genau geht denn aktuell nicht, Fehlermeldung?
nach
Collections in JPA JPQL/Criteria Queries (MEMBER OF, IS [NOT] EMPTY, SIZE, ...)
ist isMember() nur für Check gegen Listen der abgefragten Klasse geeignet, intern in der DB,

wenn von außen beliebige Werte übergeben werden sollen,
dann die in()-Variante?
irgendwas mit
Predicate in(java.util.Collection<?> values)

Create a predicate to test whether the expression is a member of the collection.
aus
Expression (Java EE 6 )
?
 

Smoothi

Bekanntes Mitglied
Das funktioniert leider nicht:

Code:
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Device> query = cb.createQuery(Device.class);
        
        Root rootDevice = query.from(Device.class);
        query.select(rootDevice);

        query.where(rootDevice.in(fisPoint.getDevices()));

        query.orderBy(cb.asc(rootDevice.get(Device_.serial)));
        
        return em.createQuery(query).getResultList();

also
Code:
query.where(rootDevice.in(fisPoint.getDevices()));
damit habe ich es nun versucht, da Root ja dieses Expression-Interface implementiert...
Jedoch bekomme ich nun

Code:
type Exception report

message

descriptionThe server encountered an internal error () that prevented it from fulfilling this request.

exception 

javax.servlet.ServletException
root cause 

javax.ejb.EJBException
root cause 

Exception [EclipseLink-6075] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.QueryException
Exception Description: Object comparisons can only use the equal() or notEqual() operators.  Other comparisons must be done through query keys or direct attribute level comparisons. 
Expression: [
Relation operator [ IN ]
   Base entities.Device
   Constant []]
Query: ReadAllQuery(referenceClass=Device )

Damit kann ich leider nichts anfangen.

Das Problem hatte ich bereits hier:
http://www.java-forum.org/data-tier/128530-jpa-jpql-member.html

Nun dachte ich mit der Lösung von KSG9|Sebastian mit dem CriteriaBuilder hätte sich das Problem erledigt, sobald ich weiß, wie man die Parameter übergibt... (deswegen neuer Thread)

scheinbar nicht :/
 
Zuletzt bearbeitet:

Smoothi

Bekanntes Mitglied
hey...erstmal frohes Neues ;)

irgendwie begreif ich das nicht...

der ExpressionBuilder scheint nicht im Standard enthalten zu sein...
ich vermute es ist der im Toplink-Paket (da scheints noch etwas von Apache zu geben). Also muss ich dieses einbinden und den ExpressionBuilder anstatt des CriteriaBuilders verwenden?
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben