Это мой первый вопрос, так голый со мной
Привет, я хотел бы спросить, как сделать этот запрос.
Я пытаюсь получить список одноклассников, которые находятся в том же классе, что и зарегистрированный пользователь.
Код SQL:
SELECT * FROM ziak WHERE idRocnik = (
SELECT idRocnik FROM Ziak WHERE email = "[email protected]")
[email protected] используется только в SQL, потому что у меня есть строка loggedUser, которая получает информацию о зарегистрированном пользователе (я регистрируюсь с адресами электронной почты)
У меня есть эта функция
public List<T> findSpoluziakov(){
String loggedUser = FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
Query q = getEntityManager().createQuery("SELECT z FROM Ziak z WHERE z.idRocnik = (SELECT z.idRocnik FROM Ziak z WHERE z.email = :email)");
q.setParameter("email", loggedUser);
List<T> vysledok = q.getResultList();
return vysledok;
}
но я получаю ошибку:
Причина: Исключение [EclipseLink-6069] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.QueryException Exception Описание: Поле [rocnik.IdRocnik] в этом выражении имеет недопустимую таблицу в этот контекст.
Запрос: ReadAllQuery (referenceclass= Ziak jpql = "SELECT z FROM Ziak z WHERE z.idRocnik = (SELECT z.idRocnik FROM Ziak z WHERE z.email =: email)")
Я думаю, что проблема заключается в том, что мой подзапрос не получает только один столбец для результатов, поскольку я сказал, что он должен ("SELECT z.idRocnik" в моем подзапросе), но весь список.
также как-то моя функция пытается использовать объект "rocnik" (мой другой объект с первичным ключом idRocnik), но у меня есть все, что мне нужно в одном объекте под названием "Ziak" (есть внешний ключ, ссылающийся на rocnik.IdRocnik)
мой объект "ziak":
@Entity
@Table(name = "ziak", schema="diplomovkadb")
@XmlRootElement
public class Ziak implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idZiak")
private Integer idZiak;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 45)
@Column(name = "Meno")
private String meno;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 45)
@Column(name = "Priezvisko")
private String priezvisko;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 45)
@Column(name = "Rodne_Cislo")
private String rodneCislo;
@Size(max = 4)
@Column(name = "Pohlavie")
private String pohlavie;
@Size(max = 45)
@Column(name = "Email")
private String email;
@Size(max = 45)
@Column(name = "Telefon")
private String telefon;
@Size(max = 45)
@Column(name = "Mesto")
private String mesto;
@Size(max = 45)
@Column(name = "Ulica")
private String ulica;
@Size(max = 45)
@Column(name = "CisloUlice")
private String cisloUlice;
@Size(max = 45)
@Column(name = "PSC")
private String psc;
@JoinColumn(name = "IdRocnik", referencedColumnName = "IdRocnik")
@ManyToOne
private Rocnik idRocnik;
@JoinColumn(name = "IdOdbor", referencedColumnName = "IdOdbor")
@ManyToOne
private Odbor idOdbor;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "ziak")
private Collection<Skuskaziak> skuskaziakCollection;
public Ziak() {
}
public Ziak(Integer idZiak) {
this.idZiak = idZiak;
}
public Ziak(Integer idZiak, String meno, String priezvisko, String rodneCislo) {
this.idZiak = idZiak;
this.meno = meno;
this.priezvisko = priezvisko;
this.rodneCislo = rodneCislo;
}
public Integer getIdZiak() {
return idZiak;
}
public void setIdZiak(Integer idZiak) {
this.idZiak = idZiak;
}
public String getMeno() {
return meno;
}
public void setMeno(String meno) {
this.meno = meno;
}
public String getPriezvisko() {
return priezvisko;
}
public void setPriezvisko(String priezvisko) {
this.priezvisko = priezvisko;
}
public String getRodneCislo() {
return rodneCislo;
}
public void setRodneCislo(String rodneCislo) {
this.rodneCislo = rodneCislo;
}
public String getPohlavie() {
return pohlavie;
}
public void setPohlavie(String pohlavie) {
this.pohlavie = pohlavie;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTelefon() {
return telefon;
}
public void setTelefon(String telefon) {
this.telefon = telefon;
}
public String getMesto() {
return mesto;
}
public void setMesto(String mesto) {
this.mesto = mesto;
}
public String getUlica() {
return ulica;
}
public void setUlica(String ulica) {
this.ulica = ulica;
}
public String getCisloUlice() {
return cisloUlice;
}
public void setCisloUlice(String cisloUlice) {
this.cisloUlice = cisloUlice;
}
public String getPsc() {
return psc;
}
public void setPsc(String psc) {
this.psc = psc;
}
public Rocnik getIdRocnik() {
return idRocnik;
}
public void setIdRocnik(Rocnik idRocnik) {
this.idRocnik = idRocnik;
}
public Odbor getIdOdbor() {
return idOdbor;
}
public void setIdOdbor(Odbor idOdbor) {
this.idOdbor = idOdbor;
}
@XmlTransient
public Collection<Skuskaziak> getSkuskaziakCollection() {
return skuskaziakCollection;
}
public void setSkuskaziakCollection(Collection<Skuskaziak> skuskaziakCollection) {
this.skuskaziakCollection = skuskaziakCollection;
}
@Override
public int hashCode() {
int hash = 0;
hash += (idZiak != null ? idZiak.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Ziak)) {
return false;
}
Ziak other = (Ziak) object;
if ((this.idZiak == null && other.idZiak != null) || (this.idZiak != null && !this.idZiak.equals(other.idZiak))) {
return false;
}
return true;
}
@Override
public String toString() {
return "Entity.jpa.Ziak[ idZiak=" + idZiak + " ]";
}
}
Я был бы рад за любые предложения.
Также я пытался сделать это с помощью entityManager, но получал одинаковые результаты.
СПАСИБО
ДЖОРДЖ ДЖАМБРИХ
Как насчет либо change = to "IN":
Query q = getEntityManager().createQuery("SELECT z FROM Ziak z WHERE z.idRocnik in (SELECT z.idRocnik FROM Ziak z WHERE z.email = :email)");
Или (для JPQL ORM, поэтому иногда вам не нужно, чтобы он был как SQL)
Select z from Ziak z where z.email = :email;