Syntax-Fehler beim Parsen der JPQL: Eine Identifikation variable muss vorhanden sein, mit einer range-Variablen-Deklaration
Beim ausführen dieses Codes:
List<Users> list = em.createQuery("select balance b from Users where b.userName = '" + user_name.getText() +"'", Users.class).getResultList();
Treffe ich diese Fehlermeldung:
Syntax-Fehler beim Parsen der [select balance b from Users where b.userName = 'a'].
[28, 28] Eine Identifizierung variable muss vorhanden sein, mit einer range-Variablen-Deklaration.
Möchte ich zum abrufen der Integer-Saldo aus den Benutzer, dessen name eingegeben wird, der Benutzername "TextField".
Ich bin ein ziemlicher Anfänger auf diesem Thema und das internet gibt komplizierte info. Kann mir bitte jemand freundlicherweise erklären, was falsch ist ?
Teil der Klasse Benutzer
@Entity
@Table(name = "users")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"),
@NamedQuery(name = "Users.findByUserName", query = "SELECT u FROM Users u WHERE u.userName = :userName"),
@NamedQuery(name = "Users.findByBalance", query = "SELECT u FROM Users u WHERE u.balance = :balance"),
@NamedQuery(name = "Users.findByFirstName", query = "SELECT u FROM Users u WHERE u.firstName = :firstName"),
@NamedQuery(name = "Users.findByLastName", query = "SELECT u FROM Users u WHERE u.lastName = :lastName"),
@NamedQuery(name = "Users.findByIban", query = "SELECT u FROM Users u WHERE u.iban = :iban"),
@NamedQuery(name = "Users.findByCharacterSlots", query = "SELECT u FROM Users u WHERE u.characterSlots = :characterSlots"),
@NamedQuery(name = "Users.findByLastPayment", query = "SELECT u FROM Users u WHERE u.lastPayment = :lastPayment"),
@NamedQuery(name = "Users.findByMonthsPayed", query = "SELECT u FROM Users u WHERE u.monthsPayed = :monthsPayed"),
@NamedQuery(name = "Users.findByPassword", query = "SELECT u FROM Users u WHERE u.password = :password"),
@NamedQuery(name = "Users.findByBanned", query = "SELECT u FROM Users u WHERE u.banned = :banned")})
public class Users implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "user_name")
private String userName;
@Column(name = "balance")
private Integer balance;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "iban")
private String iban;
@Column(name = "character_slots")
private Integer characterSlots;
@Column(name = "last_payment")
@Temporal(TemporalType.DATE)
private Date lastPayment;
@Column(name = "months_payed")
private Integer monthsPayed;
@Column(name = "password")
private String password;
@Column(name = "banned")
private Boolean banned;
@ManyToMany(mappedBy = "usersCollection")
private Collection<Servers> serversCollection;
@ManyToMany(mappedBy = "usersCollection")
private Collection<Characters> charactersCollection;
public Users() {
}
public Users(String userName, Integer balance, String firstName, String lastName, String iban, Integer characterSlots, Date lastPayment, Integer monthsPayed, String password, Boolean banned) {
this.userName = userName;
this.balance = balance;
this.firstName = firstName;
this.lastName = lastName;
this.iban = iban;
this.characterSlots = characterSlots;
this.lastPayment = lastPayment;
this.monthsPayed = monthsPayed;
this.password = password;
this.banned = banned;
}
Was ist die balance im Verhältnis zu den Nutzern: die Abfrage rechnet mit einer Liste der Benutzer, während das wählen, ist die Angabe Gleichgewicht. Sollte es nicht so etwas wie "Select b from Benutzer u join-u.balance b, wo b ist.userName 'a'"?
Ich habe bearbeitet die Frage, um zu zeigen, einige Users.java
Deine query ist immer noch falsch, wie es sein muss auf der Grundlage der Benutzer-Entität. Was ist die balance, und warum sollte es einen Benutzernamen?
es wurde jetzt bearbeitet
Ich habe bearbeitet die Frage, um zu zeigen, einige Users.java
Deine query ist immer noch falsch, wie es sein muss auf der Grundlage der Benutzer-Entität. Was ist die balance, und warum sollte es einen Benutzernamen?
es wurde jetzt bearbeitet
InformationsquelleAutor user3660293 | 2015-10-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie deklarieren eine variable Identifikation bei der Abfrage der Benutzer-Entität. Sie sind Abfragen gegen die Benutzer-Entität, also die Deklaration von Variablen sollte auf den Benutzer und nicht auf die balance-Eigenschaft.
Auch, Sie abrufen möchten, und der balance-Eigenschaft der user Entität, die den Typ Integer. Daher ist die Verwendung von Generika richtig zeigen den korrekten Typ.
Versuchen Sie dies:
Alternativ, wenn nur einzelne Ergebnis ist zu erwarten:
Eine korrekte Umsetzung zu verhindern, dass SQL-injection-Angriff ist die Verwendung einer parametrisierten Abfrage:
Eine andere Sache, wenn Sie denken, der das Ergebnis der Abfrage würde das Ergebnis für eine einzelne unique user (da man sich mit dem userName-Eigenschaft zum filtern der Ergebnis-und Benutzernamen wird erklärt, wie Benutzer-Primärschlüssel), dann sollten Sie getSingleResult (statt getResultList)
wenn ich verwenden Sie die variable zur Anzeige der balance, wie in diesem code-Zeile : balancetext.setText("Ihr Guthaben =" + Guthaben);. Ich bekomme eine nullpointer exception
sollten Sie nicht bekommen eine NullPointerException, wenn das Gleichgewicht-Objekt selbst ist null. Es sollte die Anzeige "Ihre Bilanz = null". Der wahrscheinlichste Grund, dass Sie immer die Ausnahme in dieser besonders Zeile, ist, dass Ihr balancetext-Objekt null ist.
Das war der Schuldige. Vielen Dank für Eure Hilfe
InformationsquelleAutor Ish
Versuchen:
Warum gehst du nicht zu sanft daran erinnern, die OP von der klaffenden SQL-injection-Angriff Loch in seinem Versuch?
Ich Stimme zu es ist besser, um die Parameter zu verwenden , aber JPQL nicht wirklich verlassen, öffnen Sie die SQL-injection-Loch als Anbieter parametrisieren können die generierten SQL. wiki.eclipse.org/EclipseLink/FAQ/Security
InformationsquelleAutor Chris