java-forum.org - Java programmieren aus Leidenschaft

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > Datenbankprogrammierung

Datenbankprogrammierung Fragen zur Anbindung und Programmierung von Datenbanken bzw. Datenbankabfragen

Antwort    
Themen-Optionen Thema durchsuchen Ansicht
Alt 20.06.2012, 19:43   #1 (permalink)
Benutzer
int
 
Registriert seit: 12.01.2012
Fachbeiträge: 55
Abgegebene Danke: 19
Erhielt 0 Danke für 0 Beiträge
Standard Problem beim Erstellen einer Query

Ich hätte gerne eine Query die mir Products sucht die einen bestimmten String im Namen haben. Also wenn der Benutzer "schraube" eingibt soll eine Liste zurückgegeben werden mit Records die im Namen "schraube" enthalten. (Schrauben, Schraubenschlüssel...). Dazu habe ich folgendes gemacht:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
@Entity
@NamedQueries({
    @NamedQuery(name="findByName",
        query="select p from Product p where lower(p.name) like '%:name%'")
})
public class Product implements Serializable, Comparable<Product> {
...

:name ist der Parameter den der Benutzer eingibt.

In meiner ProductFacade mach ich:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
    public List<Product> findProduct(String product) {
        return em.createNamedQuery("findByName", Product.class).setParameter("name", product).getResultList();
    }

Leider bekomme ich immer diese Exception:

Java Code: Quelltext in neuem Fenster öffnen
1
2
...
Caused by: java.lang.IllegalArgumentException: You have attempted to set a parameter value using a name of name that does not exist in the query string select p from Product p where lower(p.name) like '%:name%'.

Bin mir nicht sicher was mein Netbeans mir damit sagen will...
markai ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 20.06.2012, 21:44   #2 (permalink)
Stammbenutzer
Viertel Gigabyte
 
Registriert seit: 26.07.2011
Fachbeiträge: 3.116
Abgegebene Danke: 90
Erhielt 635 Danke für 624 Beiträge
Probier mal folgendes:
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
@Entity
@NamedQueries({
    @NamedQuery(name="findByName",
        query="select p from Product p where lower(p.name) like :searchPattern")
})
public class Product implements Serializable, Comparable<Product> {
..:
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
public List<Product> findProduct(String product) {
 
        final String searchPattern = 
           new ToStringBuilder().append('%').append(product).append('%').toString();
 
        return em.createNamedQuery("findByName", Product.class).setParameter("searchPattern", searchPattern).getResultList();
    }

Ich glaube, dass literale in einer JPQL-Query nicht mit dynamischen Parametern gemischt werden können. Sowas '%:name%' geht darum nicht.
__________________
http://www.winfonet.eu

Geändert von nillehammer (20.06.2012 um 21:47 Uhr)
nillehammer ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Danke sagt:
markai (22.06.2012)
Alt 20.06.2012, 21:47   #3 (permalink)
Stammbenutzer
Viertel Megabyte
 
Benutzerbild von JimPanse
 
Registriert seit: 27.07.2007
Fachbeiträge: 414
Abgegebene Danke: 0
Erhielt 75 Danke für 75 Beiträge
So sollte es funktionieren...

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
@Entity
@NamedQueries({
    @NamedQuery(name="findByName",
        query="select p from Product p where lower(p.name) like :name")
})
public class Product implements Serializable, Comparable<Product> {
...


Java Code: Quelltext in neuem Fenster öffnen
1
2
3
    public List<Product> findProduct(String product) {
        return em.createNamedQuery("findByName", Product.class).setParameter("name", product.toLowerCase()+"%").getResultList();
    }
JimPanse ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Danke sagt:
markai (22.06.2012)
Alt 22.06.2012, 09:34   #4 (permalink)
Benutzer
int
Themenstarter
 
Registriert seit: 12.01.2012
Fachbeiträge: 55
Abgegebene Danke: 19
Erhielt 0 Danke für 0 Beiträge
Vielen Dank euch beiden. Hat funktioniert! Jetzt habe ich noch ein weiteres Problem: Mein Product besteht aus mehreren Teilen. Nun möchte ich dass der Benutzer Produkte nach Teilen suchen kann.
Zwischen Product und Part besteht eine n:m Beziehung. Eigentlich brauche ich ja nur die Zwischentabelle Product_Part anzuschauen um herauszufinden welches Product welche Parts enthält. Allerdings kann ich mit jpa nicht direkt auf diese Zwischentabelle zugreifen (unknown Entity).

Hier noch der Code wie ich es momentan mache, um zu zeigen was ich vorhab:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
    public void searchByParts() {
        List<Product> result = new ArrayList<>();
        List<Part> selectedParts = partController.getAcSelectedParts();
        for (Product product : getAllProducts) {
            if (Arrays.asList(selectedParts).containsAll(product.getParts())) {
                result.add(product);
            }
        }
        this.resultList = result;
markai ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 22.06.2012, 15:02   #5 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 22.12.2009
Fachbeiträge: 163
Abgegebene Danke: 27
Erhielt 2 Danke für 2 Beiträge
Denke ich zu einfach, oder tut es das hier nicht auch?

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
@Entity
@NamedQueries({
    @NamedQuery(name="findByName",
        query="select p from Product p where lower(p.name) like '%'||:name||'%'")
})
public class Product implements Serializable, Comparable<Product> {
...

Weil nur bei einem '%:name%' wird :name als Text gewertet und nicht als Parameter. Daher hab ich das bisher immer mit dem Konkatenationsoperator || einfach verbunden.
__________________
NEIN, ich schreibe keinen schlauen Satz auf Englisch in meine Signatur, der auf Deutsch nur halb so cool wäre.
Spitfire777 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 22.06.2012, 15:36   #6 (permalink)
Stammbenutzer
Viertel Gigabyte
 
Registriert seit: 26.07.2011
Fachbeiträge: 3.116
Abgegebene Danke: 90
Erhielt 635 Danke für 624 Beiträge
Zitat:
Vielen Dank euch beiden. Hat funktioniert! Jetzt habe ich noch ein weiteres Problem: Mein Product besteht aus mehreren Teilen. Nun möchte ich dass der Benutzer Produkte nach Teilen suchen kann.
Zwischen Product und Part besteht eine n:m Beziehung. Eigentlich brauche ich ja nur die Zwischentabelle Product_Part anzuschauen um herauszufinden welches Product welche Parts enthält. Allerdings kann ich mit jpa nicht direkt auf diese Zwischentabelle zugreifen (unknown Entity).
Habe es leider nicht ausprobiert, weil es mir zu viel Aufwand war, dafür jetzt ein JPA-Projekt aufzusetzen, aber die Schlüsselworte IN , MEMBER OF oder ALL müssten Dich zum Ziel führen. Vielleicht klappt sogar schon das:
Java Code: Quelltext in neuem Fenster öffnen
1
@NamedQuery(name="findByParts", query="SELECT p FROM Product p WHERE :parts IN p.parts")
__________________
http://www.winfonet.eu
nillehammer ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 23.06.2012, 09:20   #7 (permalink)
Benutzer
int
Themenstarter
 
Registriert seit: 12.01.2012
Fachbeiträge: 55
Abgegebene Danke: 19
Erhielt 0 Danke für 0 Beiträge
Kann sein dass ich einen Denkfehler hab, aber ich glaub nicht dass das funktionieren kann. Meine Product Tabelle hat keine Parts Spalte. Muss ich die beiden Tabellen nicht über die Zwischentabelle joinen? Da dies mein erstes mal mit JPA ist hab ich keine Ahnung wie ich zu meinem Ergebnis kommen soll...
markai ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 23.06.2012, 13:49   #8 (permalink)
Stammbenutzer
Viertel Gigabyte
 
Registriert seit: 26.07.2011
Fachbeiträge: 3.116
Abgegebene Danke: 90
Erhielt 635 Danke für 624 Beiträge
Zitat:
Meine Product Tabelle hat keine Parts Spalte. Muss ich die beiden Tabellen nicht über die Zwischentabelle joinen
In plain SQL müsstest Du das. In JPA allerdings navigierst Du über die Felder, die Du in Deinen Objekten hast. Dass Product eine Collection (List? Set?) von Parts hat, habe ich aus dem Code product.getParts() in einem Deiner letzten Posts geschlossen.
Zitat:
Da dies mein erstes mal mit JPA ist hab ich keine Ahnung wie ich zu meinem Ergebnis kommen soll...
Ja, es hat bei mir auch mehr als ein Jahr gedauert, bis ich mich vom SQL-/Datenbankdenken gelöst hatte und bei den Relationen in der Objektwelt gedacht hatte.
__________________
http://www.winfonet.eu
nillehammer ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Antwort    

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
(Eclipse) Eclipse Problem beim erstellen einer JAR vegane-milch IDEs und Tools 2 04.03.2012 20:45
JPA 2.0 Query Problem raiL Data Tier 3 01.04.2010 18:10
Problem beim Erstellen der Jar File FabianK Mobile Geräte 4 02.07.2007 08:06
Problem beim Erstellen von Jar-File djui Allgemeine Java-Themen 1 12.09.2006 14:15
Problem beim Button erstellen in einem Neuen Frame Java Basics - Anfänger-Themen 1 25.04.2004 18:36


Lesezeichen

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:30 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de