java - hql join 无法解析属性;使用两个表映射

标签 java join mapping hql one-to-many

我有 2 张 table 产品( cargo )

> id, catid(category), name, price

还有猫

> with id, catname.

我想在 SQL 中这样选择

>  select * from cat join prod on cat.id=prod.catid where
> cat.name='catname';

我的查询是;

Query query = session.createQuery("from prod pr join pr.cat ct with pr.catid=ct.id where ct.name=?");

我有

could not resolve property: cat of: goods.prod [from goods.prod pr join pr.cat ct with pr.catid=ct.id where ct.name=?]

错误 在indexservice.java中,我未使用导入goods.cat。但为什么?如果我编写函数来使用导入goods.cat的goods.prod。 好的。那是没有映射的。我将其添加到 cat.java

**cat.java**

package goods;

import java.io.Serializable;
import java.util.List;
import java.util.ArrayList;
import goods.prod;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="cat")


public class cat implements Serializable {

    private Integer id;

      @Id @GeneratedValue 
      @Column(name="id")
      @OneToMany
      @JoinColumn(name="catid", referencedColumnName="id")
      private List<prod> prods;

    private static final long serialVersionUID = -4147058093508047162L;

    private String Name;

    public cat() {
    }

    public cat(int id, String Name) {
        this.id = id;
        this.Name = Name;
    }


    public Integer getId() {
        return id;
    }

     public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return Name;
    }
    public void setName(String Name) {
        this.Name = Name;
    }

    }

prod.java

package goods;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import goods.cat;

import java.io.Serializable;


@Entity
@Table(name = "prod")

public class prod implements Serializable {
    @Id @GeneratedValue 
    @Column(name = "catid")

    private Long id;

    private Integer catid;

    private String name;
    private Integer price;


    public prod() {
    }

    public prod(Long id, Integer catid, String name, Integer price) {
        this.id = id;
        this.catid = catid;
        this.name = name ;
        this.price = price;
    }

    public Long getid() {
        return id;
    }

     public void setid(Long id) {
        this.id = id;
    }

    public Integer getcatid() {
        return catid;
    }
    public void setcatid(Integer catid) {
        this.catid = catid;
    }

    public String getname() {
        return name;
    }    
    public void setname(String name) {
        this.name = name;
    }

    public Integer getprice() {
        return price;
    }   
    public void setprice(Integer price) {
        this.price = price;
    }

    }

IndexService.java

import goods.prod;
import goods.cat;
@SuppressWarnings("unchecked")
    public  static ArrayList<prod> getListOfProds(String catname,String name,Integer pricel, Integer priceh){
        ArrayList<prod> list = new ArrayList<prod>();
        Session session = HibernateUtil.openSession();
        Transaction tx = null;        
        try {
            tx = session.getTransaction();
            tx.begin();
            Query query = session.createQuery("from prod pr join pr.cat ct with pr.catid=ct.id where ct.name=?");
            //Query query = session.createQuery("from prod pr join pr.cat ct with pr.catid=ct.id where ct.name=?");
            query.setString(0, catname);
            //query.setInteger(1, pricel);
            //query.setInteger(2, priceh);
            list = (ArrayList<prod>) query.list(); 

            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
            }
            e.printStackTrace();
        } finally {
            session.close();
        }
        return list;
    }

最佳答案

在您的 prod 类(在 prod.java 中定义)中,您尚未映射字段 cat (作为对象类型 cat),您仅将 catId 映射为整数。

所以你不能使用像你这样的联接。

您可以像这样重写查询:

FROM prod pr, cat ct
WHERE pr.catid = ct.id
AND ct.name = ?

关于java - hql join 无法解析属性;使用两个表映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36668585/

相关文章:

java - 尝试连接并发送 telnet 命令时出现 NPE

c# - Entity Framework 加入与包含

sql - 地理( map )数据的理想数据库

java - 从简单的 java 对象 (POJO) 进行 getter 到 setter 映射的好方法是什么?可以使用反射吗?

java - 在 Firebase android 中的两个日期内搜索子值

java - 在套接字编程中将列表作为输入

mysql - Golang db.Query with sql join

python - 合并 Pandas 中的两个数据框

opengl - 3D投影映射

Java自行车和自行车测试