Java Hibernate注释查询混淆

Java Hibernate注释查询混淆,java,hibernate,annotations,hql,hibernate-mapping,Java,Hibernate,Annotations,Hql,Hibernate Mapping,我有4个表,其中purchaseOrder与sullpier、item和ordertype有关系。 purchaseOrder所有表的引用键为supplierIdfk、itemIdfk、orderTypeIdfk 那么我的问题是,我如何才能得到具有suplliername=“XXX”的purchaseOrder记录,suplliername是供应商表的一列 我使用hibernate注释,而对于反手,我使用mysql 我已经映射了所有带有注释的实体。 谢谢你抽出时间 我的桌子看起来像这样 CREA

我有4个表,其中purchaseOrder与sullpier、item和ordertype有关系。 purchaseOrder所有表的引用键为supplierIdfk、itemIdfk、orderTypeIdfk

那么我的问题是,我如何才能得到具有suplliername=“XXX”的purchaseOrder记录,suplliername是供应商表的一列

我使用hibernate注释,而对于反手,我使用mysql

我已经映射了所有带有注释的实体。 谢谢你抽出时间

我的桌子看起来像这样

CREATE TABLE `purchaseorder` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`discount` double NOT NULL,
`finalAmount` double NOT NULL,
`remark` varchar(255) DEFAULT NULL,
`shipDate` datetime DEFAULT NULL,
`unitPrice` double NOT NULL,
`itemIdfk` int(11) DEFAULT NULL,
`orderIdfk` int(11) DEFAULT NULL,
`supplierIdfk` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `indexPurchaseOrderShipDate` (`shipDate`),
KEY `FKDFD4BAAD36B52348` (`itemIdfk`),
KEY `FKDFD4BAADFD3C54D4` (`orderIdfk`),
KEY `FKDFD4BAAD79028B3A` (`supplierIdfk`),
CONSTRAINT `FKDFD4BAAD36B52348` FOREIGN KEY (`itemIdfk`) REFERENCES `item` (`id`),
CONSTRAINT `FKDFD4BAAD79028B3A` FOREIGN KEY (`supplierIdfk`) REFERENCES `supplier`    (`id`),
CONSTRAINT `FKDFD4BAADFD3C54D4` FOREIGN KEY (`orderIdfk`) REFERENCES `ordertype` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 org.hibernate.QueryException: Unable to resolve path [PurchaseOrder.supplierIdfk], unexpected token [PurchaseOrder] [FROM org.chillies.database.PurchaseOrder WHERE PurchaseOrder.supplierIdfk=Supplier.id AND Supplier.name=?]
at org.hibernate.hql.ast.tree.IdentNode.resolveAsNakedComponentPropertyRefLHS(IdentNode.java:219)
at org.hibernate.hql.ast.tree.IdentNode.resolve(IdentNode.java:108)
at org.hibernate.hql.ast.tree.DotNode.resolveFirstChild(DotNode.java:175)
at org.hibernate.hql.ast.HqlSqlWalker.lookupProperty(HqlSqlWalker.java:550)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.addrExpr(HqlSqlBaseWalker.java:4543)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1289)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4243)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3722)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1864)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1789)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:818)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:604)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:288)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:231)
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at      org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)
at     org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1651)
at org.chillies.dataaccesslayer.DataAccessLayer.getPurchaseOrder(DataAccessLayer.java:748)
at TestDataAccess.purchaseOrderDalTest(TestDataAccess.java:368)
at TestDataAccess.main(TestDataAccess.java:404)
Exception in thread "main" java.lang.NullPointerException
at TestDataAccess.purchaseOrderDalTest(TestDataAccess.java:370)
at TestDataAccess.main(TestDataAccess.java:404)
purchaseOrder的实体代码如下所示

 package org.chillies.database;
 import java.util.Date;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import org.hibernate.annotations.Index;
 @Entity
 public class PurchaseOrder {
private int id;
private Date shipDate;
private double unitPrice;
private double discount;
private double finalAmount;
private String remark;
private OrderType orderType;
private Supplier supplier;
private Item item;

private static final String KeyOrderId = "orderIdfk";
private static final String KeySupplierId = "supplierIdfk";
private static final String KeyItemId = "itemIdfk";


@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}
@Index(name = "indexPurchaseOrderShipDate")
public Date getShipDate() {
    return shipDate;
}

public void setShipDate(Date shipDate) {
    this.shipDate = shipDate;
}

public double getUnitPrice() {
    return unitPrice;
}

public void setUnitPrice(double unitPrice) {
    this.unitPrice = unitPrice;
}

public double getDiscount() {
    return discount;
}

public void setDiscount(double discount) {
    this.discount = discount;
}

public double getFinalAmount() {
    return finalAmount;
}

public void setFinalAmount(double finalAmount) {
    this.finalAmount = finalAmount;
}

public String getRemark() {
    return remark;
}

public void setRemark(String remark) {
    this.remark = remark;
}


@ManyToOne
@JoinColumn(name = KeyOrderId)
public OrderType getOrderType() {
    return orderType;
}

public void setOrderType(OrderType orderType) {
    this.orderType = orderType;
}

@ManyToOne
@JoinColumn(name = KeySupplierId)
public Supplier getSupplier() {
    return supplier;
}

public void setSupplier(Supplier supplier) {
    this.supplier = supplier;
}

@ManyToOne
@JoinColumn(name = KeyItemId)
public Item getItem() {
    return item;
}

public void setItem(Item item) {
    this.item = item;
}
 }
 createQuery("FROM PurchaseOrder po LEFT JOIN FETCH po.supplier sup WHERE sup.name=:supName").setString("supName",suplierName);
实际上,我正在使用这样的查询代码,但它给了我错误

public PurchaseOrder getPurchaseOrder(String supplierName) {
    Session session = null;
    PurchaseOrder purchaseOrder = new PurchaseOrder();

    try {
        session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        Query query=session.createQuery("FROM PurchaseOrder WHERE PurchaseOrder.supplierIdfk=Supplier.id AND Supplier.name=?");
        purchaseOrder = (PurchaseOrder)query.uniqueResult();
        query.setString("Supplier.name",supplierName);
        session.getTransaction().commit();
    } catch (HibernateException e) {
        if (session != null) {
            session.getTransaction().rollback();
            e.printStackTrace();
        }
    } finally {
        if (session != null) {
            session.close();
        }
    }
    return purchaseOrder;
}
我的错误代码是这样的

CREATE TABLE `purchaseorder` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`discount` double NOT NULL,
`finalAmount` double NOT NULL,
`remark` varchar(255) DEFAULT NULL,
`shipDate` datetime DEFAULT NULL,
`unitPrice` double NOT NULL,
`itemIdfk` int(11) DEFAULT NULL,
`orderIdfk` int(11) DEFAULT NULL,
`supplierIdfk` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `indexPurchaseOrderShipDate` (`shipDate`),
KEY `FKDFD4BAAD36B52348` (`itemIdfk`),
KEY `FKDFD4BAADFD3C54D4` (`orderIdfk`),
KEY `FKDFD4BAAD79028B3A` (`supplierIdfk`),
CONSTRAINT `FKDFD4BAAD36B52348` FOREIGN KEY (`itemIdfk`) REFERENCES `item` (`id`),
CONSTRAINT `FKDFD4BAAD79028B3A` FOREIGN KEY (`supplierIdfk`) REFERENCES `supplier`    (`id`),
CONSTRAINT `FKDFD4BAADFD3C54D4` FOREIGN KEY (`orderIdfk`) REFERENCES `ordertype` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 org.hibernate.QueryException: Unable to resolve path [PurchaseOrder.supplierIdfk], unexpected token [PurchaseOrder] [FROM org.chillies.database.PurchaseOrder WHERE PurchaseOrder.supplierIdfk=Supplier.id AND Supplier.name=?]
at org.hibernate.hql.ast.tree.IdentNode.resolveAsNakedComponentPropertyRefLHS(IdentNode.java:219)
at org.hibernate.hql.ast.tree.IdentNode.resolve(IdentNode.java:108)
at org.hibernate.hql.ast.tree.DotNode.resolveFirstChild(DotNode.java:175)
at org.hibernate.hql.ast.HqlSqlWalker.lookupProperty(HqlSqlWalker.java:550)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.addrExpr(HqlSqlBaseWalker.java:4543)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1289)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4243)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3722)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1864)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1789)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:818)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:604)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:288)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:231)
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at      org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)
at     org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1651)
at org.chillies.dataaccesslayer.DataAccessLayer.getPurchaseOrder(DataAccessLayer.java:748)
at TestDataAccess.purchaseOrderDalTest(TestDataAccess.java:368)
at TestDataAccess.main(TestDataAccess.java:404)
Exception in thread "main" java.lang.NullPointerException
at TestDataAccess.purchaseOrderDalTest(TestDataAccess.java:370)
at TestDataAccess.main(TestDataAccess.java:404)
org.hibernate.QueryException:无法解析路径[PurchaseOrder.supplierIdfk],来自org.chillies.database.PurchaseOrder的意外标记[PurchaseOrder],其中PurchaseOrder.supplierIdfk=Supplier.id和Supplier.name=?]
位于org.hibernate.hql.ast.tree.IdentNode.resolveAsNakedComponentPropertyRefLHS(IdentNode.java:219)
位于org.hibernate.hql.ast.tree.IdentNode.resolve(IdentNode.java:108)
位于org.hibernate.hql.ast.tree.DotNode.resolveFirstChild(DotNode.java:175)
位于org.hibernate.hql.ast.hqlslwalker.lookupProperty(hqlslwalker.java:550)
位于org.hibernate.hql.antlr.HqlSqlBaseWalker.addrExpr(HqlSqlBaseWalker.java:4543)
位于org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1289)
位于org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4243)
位于org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonextpr(HqlSqlBaseWalker.java:3722)
位于org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1864)
位于org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1789)
位于org.hibernate.hql.antlr.HqlSqlBaseWalker.where子句(HqlSqlBaseWalker.java:818)
位于org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:604)
位于org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:288)
位于org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:231)
位于org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254)
位于org.hibernate.hql.ast.QueryTranslatorImpl.docomfile(QueryTranslatorImpl.java:185)
位于org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
在org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:101)
在org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:80)
位于org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)
位于org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
位于org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
位于org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1651)
在org.chillies.dataaccesslayer.dataaccesslayer.getPurchaseOrder(dataaccesslayer.java:748)上
在TestDataAccess.purchaseOrderDalTest(TestDataAccess.java:368)
位于TestDataAccess.main(TestDataAccess.java:404)
线程“main”java.lang.NullPointerException中出现异常
在TestDataAccess.purchaseOrderDalTest(TestDataAccess.java:370)
位于TestDataAccess.main(TestDataAccess.java:404)

假设您正确地完成了所有映射,则查询如下所示

    List<PurchaseOrder> purchaseOrders;
    Session session = HibernateUtil.getSession();
    Query query = session.createQuery("from PurchaseOrder  po where po.supplierName = ?1");
    query.setString(1, pass_your_supplier_name);
    purchaseOrders = query.list();
列出采购订单;
Session Session=HibernateUtil.getSession();
Query Query=session.createQuery(“来自PurchaseOrder po,其中po.supplierName=?1”);
query.setString(1,传递您的供应商名称);
purchaseOrders=query.list();
试试看

Query Query=session.createQuery(“从PurchaseOrder po、Supplier sup中选择新的fu.bar.PurchaseOrderDto(po.id、po.x、po.y、po.z),其中po.Supplier.id=sup.id和sup.name=?”

Query Query=session.createQuery(“来自采购订单采购订单,其中采购订单供应商id=sup.id,供应商名称=?”

正如我在评论中所说: 如果您使用的是HQL,则必须使用java对象变量,而不是数据库字段

我不知道第二个是否有效,因为“from”后面没有提到供应商。如果不起作用,请在实体中创建两个构造函数:空构造函数和一个包含所需字段的构造函数,或者创建一个包含所需字段的DTO。然后使用第一个查询

编辑: 第二个问题是“query.setString”。它做不到你想要的。请改用setParameter:

    [...]
    Query query=session.createQuery("select new fu.bar.PurchaseOrderDto(po.id, po.x, po.y, po.z) FROM PurchaseOrder po, Supplier sup WHERE po.supplier.id=sup.id AND sup.name= :supName ");
    query.setParameter("supName",supplierName);
    purchaseOrder = (PurchaseOrder)query.uniqueResult();
    session.getTransaction().commit();
    [...]

谢谢你的回复和宝贵的时间

我找到了答案

我已经像这样构建了我的查询

 package org.chillies.database;
 import java.util.Date;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import org.hibernate.annotations.Index;
 @Entity
 public class PurchaseOrder {
private int id;
private Date shipDate;
private double unitPrice;
private double discount;
private double finalAmount;
private String remark;
private OrderType orderType;
private Supplier supplier;
private Item item;

private static final String KeyOrderId = "orderIdfk";
private static final String KeySupplierId = "supplierIdfk";
private static final String KeyItemId = "itemIdfk";


@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}
@Index(name = "indexPurchaseOrderShipDate")
public Date getShipDate() {
    return shipDate;
}

public void setShipDate(Date shipDate) {
    this.shipDate = shipDate;
}

public double getUnitPrice() {
    return unitPrice;
}

public void setUnitPrice(double unitPrice) {
    this.unitPrice = unitPrice;
}

public double getDiscount() {
    return discount;
}

public void setDiscount(double discount) {
    this.discount = discount;
}

public double getFinalAmount() {
    return finalAmount;
}

public void setFinalAmount(double finalAmount) {
    this.finalAmount = finalAmount;
}

public String getRemark() {
    return remark;
}

public void setRemark(String remark) {
    this.remark = remark;
}


@ManyToOne
@JoinColumn(name = KeyOrderId)
public OrderType getOrderType() {
    return orderType;
}

public void setOrderType(OrderType orderType) {
    this.orderType = orderType;
}

@ManyToOne
@JoinColumn(name = KeySupplierId)
public Supplier getSupplier() {
    return supplier;
}

public void setSupplier(Supplier supplier) {
    this.supplier = supplier;
}

@ManyToOne
@JoinColumn(name = KeyItemId)
public Item getItem() {
    return item;
}

public void setItem(Item item) {
    this.item = item;
}
 }
 createQuery("FROM PurchaseOrder po LEFT JOIN FETCH po.supplier sup WHERE sup.name=:supName").setString("supName",suplierName);

展示你尝试过的内容并提出具体问题我尝试过简单加入,左外加入,我甚至已经用所有字段编写了整个查询,但它一直给我null之类的错误。supplierIdfk找不到你能发布你的整个代码以获得一些线索吗?你是指整个注释实体?你的表和PurchaseOrder的实体是什么样子的?如果“supplierIdfk”是表中的一个字段,并且实体类“PurchaseOrder”具有不同的变量名,HQL将找不到该字段。在HQL中,您必须使用对象及其类变量。实际上,我可以插入update delete reord,并且我的映射已正确完成,但问题是我的supllier表的字段的列名为“name”,而item表的字段的列名为“name”所以,若两个父表具有相同的列名,那个么该如何工作呢?若两个表具有相同的列名,您可以使用别名(例如supplier.name、item.name)引用它们。如果您感到困惑,您可以在实体中更改它,使其具有不同的字段,如supplierName&ItemName。我已经用代码更新了我的问题。现在,您能告诉我您的PurchaseOrder实体中是否存在此类字段supplierIdfk吗?为什么不能在数据库的PurchaseOrder表中有“FROM PurchaseOrder po WHERE po.supplier.name=?1”这样的查询,我已将名称supplierIdfk归档,它是来自供应商的PurchaseOrder的重构键,同时,我在Purchaseorder实体中有一个供应商实例,该实体用关系shipDTO注释,它们是用于携带的简单的普通对象