JPA: Nach String statt Primärschlüssel suchen

Tabkas

Mitglied
Abend,

also bei JPA. Mit:

em.find(Tabelle.class, query)

kann man ja suchen, aber eben nur nach Primärschlüsselwerten.

Was, wenn ich nun zB einfach nach einem Wert suchen will? Also eine SELECT WHERE LIKE Abfrage senden will, aber eben mit JPA?

Google gab mir sowas wie:

@Query("SELECT u.username FROM User u WHERE u.username LIKE CONCAT('%',:username,'%')")
List<User> findByUserLike(String user);

Ich nehme an, das soll in die Entitätsklasse geschrieben werden?
Da kommen bei mir aber nur 2 Fehlermeldungen:
1. This method requires a body instead of a semicolon
2. Query is not an annotation type

Wie kann man also danach suchen?

Ich nutze übrigens EclipseLink.

Ich wäre sehr, sehr dankbar für Hilfe!

Beste Grüße
Tabkas
 

httpdigest

Top Contributor
em.find(Tabelle.class, query)
In diesem Fall ist `query` aber keine Query (also javax.persistence.Query) sondern einfach java.lang.Object. Die EntityManager.find(Class, Object) Methode bekommt also die Klasse der zu findenden Entität sowie den Primärschlüssel.

Da kommen bei mir aber nur 2 Fehlermeldungen:
1. This method requires a body instead of a semicolon
2. Query is not an annotation type
Diese Fehlermeldung hat nichts mit JPA zu tun, sondern damit, dass du syntaktisch ungültigen Java-Code erzeugt hast.

Wie kann man also danach suchen?
Ich würde dir erstmal die Suche nach JPA Tutorials (und Java-Grundlagentutorials) empfehlen. Für ersteres z.B. erstmal: https://www.baeldung.com/jpa-queries
 

Tabkas

Mitglied
Danke für die Antwort.

Bei dem verlinkten Artikel wird ja überall reine SQL Syntax in einen Query gepackt außer bei
Criteria API Query
.
Ist es also das, was du empfiehlst? Denn reine SQL Syntax würde ich eher meiden wollen, dafür wählte ich ja JPA.

Grüße
 

httpdigest

Top Contributor
Denn reine SQL Syntax würde ich eher meiden wollen, dafür wählte ich ja JPA.
Du kannst ganz getrost JPQL verwenden. JPA spezifiziert diese Sprache und Implementierungen davon enthalten entsprechende Umwandlungen in die Dialekte der verwendeten relationalen SQL-basierten Datenbank. JPA ist ausschließlich für SQL-basierte Datenbanken, somit ist JPQL auch ein durchaus vernünftiger Ansatz, seine Queries zu formulieren.
 

Tabkas

Mitglied
Ich erhalte bei allen Methoden folgenden Fehler:

Code:
[EL Warning]: 2019-10-17 13:41:47.535--UnitOfWork(1958592872)--Exception [EclipseLink-3002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.ConversionException
Exception Description: The object [false], of class [class java.lang.Boolean], from mapping [org.eclipse.persistence.mappings.DirectToFieldMapping[aktiv-->ANGEBOTE.AKTIV]] with descriptor [RelationalDescriptor(model.Angebote --> [DatabaseTable(ANGEBOTE)])], could not be converted to [class java.lang.Byte].
Exception in thread "main" javax.persistence.PersistenceException: Exception [EclipseLink-3002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.ConversionException
Exception Description: The object [false], of class [class java.lang.Boolean], from mapping [org.eclipse.persistence.mappings.DirectToFieldMapping[aktiv-->ANGEBOTE.AKTIV]] with descriptor [RelationalDescriptor(model.Angebote --> [DatabaseTable(ANGEBOTE)])], could not be converted to [class java.lang.Byte].
    at org.eclipse.persistence.internal.jpa.QueryImpl.getSingleResult(QueryImpl.java:547)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getSingleResult(EJBQueryImpl.java:400)
    at Test.main(Test.java:42)
Caused by: Exception [EclipseLink-3002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.ConversionException
Exception Description: The object [false], of class [class java.lang.Boolean], from mapping [org.eclipse.persistence.mappings.DirectToFieldMapping[aktiv-->ANGEBOTE.AKTIV]] with descriptor [RelationalDescriptor(model.Angebote --> [DatabaseTable(ANGEBOTE)])], could not be converted to [class java.lang.Byte].
    at org.eclipse.persistence.exceptions.ConversionException.couldNotBeConverted(ConversionException.java:75)
    at org.eclipse.persistence.internal.helper.ConversionManager.convertObjectToByte(ConversionManager.java:299)
    at org.eclipse.persistence.internal.helper.ConversionManager.convertObject(ConversionManager.java:126)
    at org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform.convertObject(DatasourcePlatform.java:179)
    at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.getObjectValue(AbstractDirectMapping.java:620)
    at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.valueFromRow(AbstractDirectMapping.java:1218)
    at org.eclipse.persistence.mappings.DatabaseMapping.readFromRowIntoObject(DatabaseMapping.java:1512)
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildAttributesIntoObject(ObjectBuilder.java:461)
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:1004)
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildWorkingCopyCloneNormally(ObjectBuilder.java:898)
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObjectInUnitOfWork(ObjectBuilder.java:851)
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:734)
    at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:688)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.buildObject(ObjectLevelReadQuery.java:795)
    at org.eclipse.persistence.queries.ReadAllQuery.registerResultInUnitOfWork(ReadAllQuery.java:890)
    at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:509)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1168)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1127)
    at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:403)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1215)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1804)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1786)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1751)
    at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:258)
    at org.eclipse.persistence.internal.jpa.QueryImpl.getSingleResult(QueryImpl.java:517)


Angebote sieht folgendermaßen aus (ohner getter setter und imports):

Java:
/**
 * The persistent class for the angebote database table.
 * 
 */
@Entity
@NamedQuery(name="Angebote.findAll", query="SELECT a FROM Angebote a")
public class Angebote implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int angebotsID;

    private byte aktiv;

    private String angebotsURL;

    @Temporal(TemporalType.DATE)
    private Date datum;

    private byte manuellUeberarbeitet;

    private double umsatz;

    private String vertriebskanalAngebotsID;

    //bi-directional many-to-one association to Artikel
    @ManyToOne
    @JoinColumn(name="ArtikelID")
    private Artikel artikel;

    //bi-directional many-to-one association to Vertriebskanaele
    @ManyToOne
    @JoinColumn(name="VertriebskanalID")
    private Vertriebskanaele vertriebskanaele;

    //bi-directional many-to-one association to Lager
    @OneToMany(mappedBy="angebote")
    private List<Lager> lagers;

    //bi-directional many-to-one association to Verkaeufe
    @OneToMany(mappedBy="angebote")
    private List<Verkaeufe> verkaeufes;


Die Fehlermeldung sagt, es gäbe einen Konvertierungsfehler von boolesch zu byte. Wo kommt aber boolesch her?

Das Programm zum ausführen ist folgendes Testprogramm:


Java:
        double umsatz = 17.99;
        
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("...");
        EntityManager em = emf.createEntityManager();
        
            CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
            
            CriteriaQuery<Angebote> criteriaQuery = criteriaBuilder.createQuery(Angebote.class);
            
            Root<Angebote> userRoot = criteriaQuery.from(Angebote.class);
            
            Angebote queryResult = em.createQuery(criteriaQuery.select(userRoot)
                                      .where(criteriaBuilder.equal(userRoot.get("umsatz"), umsatz)))
                                      .getSingleResult();


Ich weiss nicht woher boolean kommt. Ich habe die booleschen Werte als tinyint also als byte in die Tabellen eingetragen:
private byte aktiv;

Könnt ihr da helfen?

Wenn ihr mehr Infos benötigt sagt bitte Bescheid!

Vielen Dank!!
Grüße
 
Zuletzt bearbeitet von einem Moderator:

mrBrown

Super-Moderator
Mitarbeiter
Warum nimmst du nicht einfach boolean, wenn du boolean brauchst?
In Java musst du kein Byte nutzen, um booleans darzustellen, das Mapping übernimmt JPA
 

Tabkas

Mitglied
Die Entitätsklassen wurden automatisch mit byte erstellt.

Meinst du, ich sollte die Datentypen in den Entitätsklassen zu boolean ändern?
 

Tabkas

Mitglied
Update:
Ich habe das nun probiert ("Meinst du, ich sollte die Datentypen in den Entitätsklassen zu boolean ändern?").

Es kommt die Fehlermeldung nicht mehr. Nur die Rückgabe ist null. VIelleicht ist der query falsch, ich schaue ab hier mal selber weiter. Bei Problemen die ich nicht selber lösen kann melde ich nochmal :D

Vielen Dank soweit!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M SQLite Suche nach String Datenbankprogrammierung 4
R Nach String in MySQL datenbank suchen Datenbankprogrammierung 7
T SQL-Statement Datenbank nach SQL Statement schließen? Datenbankprogrammierung 7
M Datenbank Zugraff nach Umwandlung in .jar-Datei nicht mehr möglich Datenbankprogrammierung 4
N Datenbank abfragen nach bestimmten Wort Datenbankprogrammierung 7
Z MySQL "Too many connections" auch nach schliessen der Connections. Datenbankprogrammierung 10
J Sql Anfrage nach einer Zeile beenden Datenbankprogrammierung 6
ruutaiokwu SQL-Dump nach MariaDB laden? Datenbankprogrammierung 6
Thallius MySQL jdbc schließt Verbindung nach vielen Request von selber Datenbankprogrammierung 8
S MySQL JTable zeigt nach Datenbankabfrage eine Spalte zu viel an Datenbankprogrammierung 0
D MySQL Suche nach Max Value in einer Tabelle Datenbankprogrammierung 7
G PostgreSQL Nach Monaten auf einmal ClassNotFound-Exception Datenbankprogrammierung 3
C MySQL JTable in JScrollPane nach insert aktualisieren Datenbankprogrammierung 3
J SQLite Datenverlust nach beenden des Programmes Datenbankprogrammierung 21
J Fehlende DatenbankView nach einbeziehen von JDBC Datenbankprogrammierung 3
B Leerzeichen nach Umlaut -> Sichtbar erst nach Query! Datenbankprogrammierung 6
D Zeit von SQL nach Java Datenbankprogrammierung 2
M DB-Zugriff funktioniert nach JAR-Erstellung nicht mehr Datenbankprogrammierung 3
AssELAss Oracle Suche nach Umlauten Ä und Ae ermöglichen Datenbankprogrammierung 11
G HSQLDB Inserts/Updates sind nach Neustart der Anwendung Datenbankprogrammierung 1
S MySQL Nach wiederholtem Update falsche Werte (im Speicher?) Datenbankprogrammierung 1
Z PDF nach Formate sortieren Datenbankprogrammierung 3
A Nach Export mysql Verbindung zur Datenbank nicht möglich, was tun? Datenbankprogrammierung 7
F Java SQL Syntax Error erst nach mehrmaligen Aufrufen Datenbankprogrammierung 3
R vor/nach INSERT mysql-SETS absetzen Datenbankprogrammierung 2
C Programm wird nach DB-Eintrag nicht weitergeführt Datenbankprogrammierung 5
E Abfrage nach existierender SQL-Tabelle Datenbankprogrammierung 7
P MySQL Verbindung nach außen sehr langsam Datenbankprogrammierung 4
S Nochmals: ID ermitteln nach Insert Datenbankprogrammierung 2
P JPA- Entities bleiben nach dem Löschen (unsichtbar?) in der Datenbank Datenbankprogrammierung 6
GianaSisters MS SQL unter Netbeans OK - nach konvertieren Absturz Datenbankprogrammierung 6
R SQL Abfrage, je nach ausgewählten Parametern Datenbankprogrammierung 11
I Zugriff auf Datenbank nach Erstellen einer Executable Jar Datei verweigert Datenbankprogrammierung 10
M Datenbankeintrag bleibt nach Löschen in JSP vorhanden Datenbankprogrammierung 8
0 Filtern nach mehreren Kriterien Datenbankprogrammierung 4
T filtern nach expliziten Worten trotz LIKE '%Wort%' Datenbankprogrammierung 2
E Nach Server wechsel Datenbank fehler ?!? Datenbankprogrammierung 3
F SQL ordnen nach zueinander in Verhältnis gesetzten Spaltenwerten Datenbankprogrammierung 11
J SQL: Sortierung nach Wortlänge Datenbankprogrammierung 2
Java.getSkill() Datensatz / Tupel automatisch nach xy Tagen / Stunden löschen Datenbankprogrammierung 7
T JPA: NullPointerException nach persist Datenbankprogrammierung 3
T Eintragung in einer Spalte nach Abfrage Datenbankprogrammierung 11
E Hibernate Session closed nach Transaction commit? Datenbankprogrammierung 7
K Rundungsfehler bei Gleitkommazahlen von Java nach SQL Datenbankprogrammierung 2
B Spaltennamen von MySQL Datenbank nach Java auslesen Datenbankprogrammierung 10
alexpetri Problem mit jdbc MS Access / nach 670 inserts ist schluss. Datenbankprogrammierung 4
tfa Apache DBCP: Reconnect nach Timeout? Datenbankprogrammierung 3
M mySQL zugriff funktionert nach ca4 stündiger laufzeit nicht Datenbankprogrammierung 6
G Hilfe: Werte sind alle x2 (oder mehr) nach JOIN Datenbankprogrammierung 13
M sql-code für suche in tabelle nach höchster transaktionsnr Datenbankprogrammierung 12
T ibatis + "generated p-key" nach insert? Datenbankprogrammierung 24
G Herausfinden des Primary Keys nach INSERT-Kommando? Datenbankprogrammierung 4
T Tabellen aus Datenbank 1 nach Datenbank 2 Datenbankprogrammierung 2
C Resultset nach connection close weiterreichen Datenbankprogrammierung 5
E JDBC, ForwardOnly bei ResultSet nach Uebergabe Datenbankprogrammierung 4
G Suchen nach Autowerten in Access-DB Datenbankprogrammierung 20
D JAVA hängt nach SQL Abfrage Datenbankprogrammierung 7
I Nach export zur .jar keine verbindung mehr Datenbankprogrammierung 7
M Datenbankverbindung bricht nach ca. 12 Stunden Verbindung ab Datenbankprogrammierung 3
M Daten von MySQL nach MSSql probleme beim schreiben Datenbankprogrammierung 3
G File nach Blob konvertieren ? Datenbankprogrammierung 6
M Abfrage trennt Ergbnis eines Atrributes nach den Leerzeichen Datenbankprogrammierung 4
F Treiber nachladen oder nach Bedarf Datenbankprogrammierung 4
P Primärschlüssel direkt nach der Eingabe wieder auslesen Datenbankprogrammierung 7
R MySQL Syntax für suche nach Textteil Datenbankprogrammierung 8
D SQL Server Android App: 'int java.lang.String.length()' on a null object reference Datenbankprogrammierung 15
M Oracle String aus Column splitten und x Rows daraus erstellen Datenbankprogrammierung 1
C String in Datenbank einfügen Datenbankprogrammierung 11
E Conversion failed when converting date and/or time from character string. Datenbankprogrammierung 3
D String übergeben Datenbankprogrammierung 7
X MySQL Json String in MySQL einfügen. Datenbankprogrammierung 20
C Objekte aus DB in Strings umwandeln also von List<Objekt> in String Datenbankprogrammierung 6
A ByteArray zu String dann wieder zu ByteArray Datenbankprogrammierung 2
D HSQLDB SQL ORDER BY nur mit fixen String machbar? Datenbankprogrammierung 16
F Dynamischen String in SQL Statement einbinden Datenbankprogrammierung 9
N String Array in While Schleife befüllen Datenbankprogrammierung 2
H Derby: SYSCS_UTIL.SYSCS_EXPORT_QUERY mit String Abfrage in wehre-Klausel nicht möglich Datenbankprogrammierung 3
R Zeichenkette in String zählen Datenbankprogrammierung 3
P GWT Applikation-The method forName(String) is undefined for the type Class Datenbankprogrammierung 10
B Mysql speichert keine 0 alls String Datenbankprogrammierung 11
B MySQL Datenbank Connection als String zurückgeben Datenbankprogrammierung 7
F Oracle ResultSet zu einer HashMap<Integer, String[]> Datenbankprogrammierung 6
I DB-Zelleninhalt mit String vergleichen klappt nicht Datenbankprogrammierung 3
I SQL_Abfrage-Ergebnis (ResultSet) in String[] speichern Datenbankprogrammierung 29
M SQL String Datenbankprogrammierung 2
G Sonderzeichen im String codieren Datenbankprogrammierung 4
K Date in SQL-String konvertieren Datenbankprogrammierung 3
B String aus txtDatei auslesen und in Datenbank schreiben. Datenbankprogrammierung 8
T Mittels SQL-String ein Berechnung vornehmen Datenbankprogrammierung 2
C SQL String zwei Tabellen vergleichen und gleiche Zeile löschen Datenbankprogrammierung 25
C Split String für SQl query Datenbankprogrammierung 10
J String[] in eine SQL-Anweisung implementieren Datenbankprogrammierung 13
F ResultSet to String[] Datenbankprogrammierung 3
S Connection String MS Access mit Systemdatenbank / Arbeitsgruppeninformationsdatei Datenbankprogrammierung 4
G Hilfe um String an Datenbank zu schicken Datenbankprogrammierung 3
M SELECT longtext -> als String behandeln Datenbankprogrammierung 6
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
padde479 Connection String Oracle Datenbankprogrammierung 5
T SQL Date String in java.util.Date umwandeln Datenbankprogrammierung 3
G ResultSet: String mit Anführungszeichen einlesen Datenbankprogrammierung 8

Ähnliche Java Themen

Neue Themen


Oben