当前位置: 首页 > 知识库问答 >
问题:

如何更正子查询

卫才
2023-03-14

我正在尝试获取与登录用户在同一年级的同学列表。

SELECT * FROM ziak WHERE idRocnik = (
SELECT idRocnik FROM Ziak WHERE email = "example@mail.com")

我有这个功能

  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异常说明:此表达式中的字段[Rocnik.IdRocnik]在此上下文中的表无效。

我认为问题是,我的子查询不是像我说的那样只得到一列结果(在我的子查询中是“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实现这一点,但得到了相同的结果。

共有1个答案

施学
2023-03-14

将=更改为“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;
 类似资料:
  • 问题内容: 谁能看到以下查询出了什么问题? 当我运行它时,我得到: #1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第8行的’a where a.CompetitionID = Competition.CompetitionID’附近使用 问题答案: 主要问题是内部查询不能与外部语句上的子句相关,因为在内部子查询执行之前,where过滤器首先应用于要

  • 问题内容: 这种类型的东西之前已经被问过几次了,但并不是我要找的东西。我需要两行等于子查询的不同部分。 我目前正在使用: WHERE语句显然得到了简化……但是基本上它是相同的子查询,但是我不认为我应该运行两次? 我想做类似… 问题答案: 您只需将表加入子查询中即可进行一些计算,

  • 2-我在FlatList中实现分页,所以当用户到达数据列表的末尾时,我调用一个函数来增加当前页,并根据当前页更新的情况,再次提取,因为我将to useEffect传递给依赖项数组 所以这里的问题是应该将以前的数据与新数据联系起来,所以我使用方法, 它工作得很好,但有时我收到一个警告,告诉我有一个重复的数据,当我使用扩展时不工作,我得到一个很大的错误,因为Flatlist keyExtractor问

  • 问题内容: 我有此查询,它运行良好 从此查询中,我从我的位置(这是我的第一张表)中选择所有3 KM的餐厅。 但是我需要从3Km中的食品接头中选择AVG等级。 该查询也运行完美: 但是我需要添加这两个查询,通过它们我可以选择所有那些食品接头及其等级AVG。 问题答案: 只需放置子查询,您将得到结果:

  • 问题内容: 我有2张桌子,和。用户可以有很多游戏。我需要所有有人数的人,以及他们的人数(有专栏的)。 附言:我需要将所有数据加载到管理表中。由于游戏太多。我决定对数据进行分页和限制。但是,甚至限制以下查询也需要花费相同的时间。如何更好地查询? 问题答案: 您可以在下面尝试使用表达式

  • 我的程序有问题,我在使用if-else语句 在我的程序中,我试图计算字符串上的元音和辅音。我已经知道怎么做了,我的问题是我想添加一条“错误”消息,如果用户输入非字符串,它将显示错误框。 “尝试运行程序,用户将输入一个“字符串”,如果用户按“排序”,它将计算元音和辅音。我需要的是如果用户不会输入“字符串”,例如双精度或int…等等,只要它不是字符串,它就会显示错误框。