Hibernate 冬眠标准问题
假设我有两个Hibernate POJO:Customer和Order。订单表有三个相关列:customerId、totalItemsSold和totalCost。Customer表包含以下列:customerId、firstName、lastName和city 我已经在订单表和客户表之间映射了多对一。我的订单POJO包含一个客户对象。我要执行以下条件查询:Hibernate 冬眠标准问题,hibernate,criteria,Hibernate,Criteria,假设我有两个Hibernate POJO:Customer和Order。订单表有三个相关列:customerId、totalItemsSold和totalCost。Customer表包含以下列:customerId、firstName、lastName和city 我已经在订单表和客户表之间映射了多对一。我的订单POJO包含一个客户对象。我要执行以下条件查询: DetachedCriteria crit = DetachedCriteria.forClass(Order.class); crit.
DetachedCriteria crit = DetachedCriteria.forClass(Order.class);
crit.add(Restrictions.eq("customer.city", "Chicago"));
getHibernateTemplate().findByCriteria(crit);
这始终引发以下异常:
org.springframework.orm.hibernate3.HibernateQueryException: could not resolve property: customer.city of: Order
如何使用条件根据客户所在城市搜索订单?我的订单pojo确实包含一个名为“Customer”的客户对象,该对象具有适当的getter和setter
根据请求编辑(订单/客户类):
public class Customer {
private Integer customerId;
private String firstName;
private String lastName;
private String city;
public Integer getCustomerId() { return customerId; }
public void setCustomerId(Integer customerId) { this.customerId = customerId; }
public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }
public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }
public String getCity() { return city; }
public void setCity(String city) { this.city = city; }
}
public class Order {
private Customer customer;
private Integer totalItemsSold;
private Integer totalCost;
public Customer getCustomer() { return customer; }
public void setCustomer(Customer customer) { this.customer = customer; }
public Integer getTotalItemsSold() { return totalItemsSold; }
public void setTotalItemsSold(Integer totalItemsSold) { this.totalItemsSold = totalItemsSold; }
public Integer getTotalCost() { return totalCost; }
public void setTotalCost(Integer totalCost) { this.totalCost = totalCost; }
}
下面是Order类的hbm映射(其中包含Customer和Order之间的映射):
订单类中的Customer实例变量称为Customer还是customerId 订单类中的Customer实例变量是Customer还是customerId 你发布的内容看起来不错。您的hbm文件中可能有错误
没有看到完整的hbm,我很想明确地告诉您有关客户关系的独立标准:
crit.createAlias("customer", "customer");
你的帖子看起来不错。您的hbm文件中可能有错误 没有看到完整的hbm,我很想明确地告诉您有关客户关系的独立标准:
crit.createAlias("customer", "customer");
如果您只是通过customerId进行搜索,那么您拥有:
DetachedCriteria crit = DetachedCriteria.forClass(Order.class);
crit.add(Restrictions.eq("customer.customerId", 12));
getHibernateTemplate().findByCriteria(crit);
可能有用。否则,Jeff和上面提到的其他人,您必须像前面提到的那样使用join with Customer表
crit.createAlias("customer", "customer");
如果您只是通过customerId进行搜索,那么您拥有:
DetachedCriteria crit = DetachedCriteria.forClass(Order.class);
crit.add(Restrictions.eq("customer.customerId", 12));
getHibernateTemplate().findByCriteria(crit);
可能有用。否则,Jeff和上面提到的其他人,您必须像前面提到的那样使用join with Customer表
crit.createAlias("customer", "customer");
您可以发布您的订单和客户代码吗?@Jeff-它们已添加到我的post@David-请始终在查询、异常消息和POJO代码旁边发布相关实体的完整Hibernate映射。谢谢您发布您的订单和客户代码?@Jeff-它们已添加到我的post@David-请始终在查询、异常消息和POJO代码旁边发布相关实体的完整Hibernate映射。感谢customer对象名为customer,但主键名为customerId。customer对象名为customer,但主键名为customerId。有趣的是……添加别名确实允许我基于customer对象进行查询,但现在结果重复了。例如,Bob在1月1日、2月1日和3月1日下订单。我收到三份一月一日的订单,三份二月一日的订单,三份三月一日的订单。很奇怪。有什么想法吗?添加crit.setResultTransformer(Criteria.DISTINCT\u ROOT\u ENTITY)修复了复制问题。听起来像笛卡尔积问题。在这种情况下,这不是Hibernate问题,而是查询逻辑的问题。很难说问题到底出在哪里,因为您的实体似乎与您的描述不匹配(没有订单日期),并且您的hbm没有发布(这将显示其他多对一关系和获取类型)。多个集合类型的急切抓取通常是重复行的罪魁祸首。IIRC、不同的根实体只是掩盖了您的问题。因为它是一个结果转换器,所以重复的行仍然会从数据库返回,但是Hibernate会过滤掉它们。这是一个有两个原因的问题:它表明您的查询不正确,并且它为不正确的连接在数据库上增加了不必要的负载。随着这些表的增长,这可能会导致性能下降。我想我对问题所在有所猜测。当我们使用crit.createAlias(“客户”、“客户”)时,hibernate可能正在进行完全连接(类似于从客户、订单中选择*)。如何在createAlias上分配限制?有点像crit.mustEqual(“customerId”、“customerId”)强制customerId值相等(比如customer.customerId=order.customerId上的客户内部联接顺序选择*)?有趣的是……添加别名确实让我可以基于客户对象进行查询,但现在结果重复了。例如,Bob在1月1日、2月1日和3月1日下订单。我收到三份一月一日的订单,三份二月一日的订单,三份三月一日的订单。很奇怪。有什么想法吗?添加crit.setResultTransformer(Criteria.DISTINCT\u ROOT\u ENTITY)修复了复制问题。听起来像笛卡尔积问题。在这种情况下,这不是Hibernate问题,而是查询逻辑的问题。很难说问题到底出在哪里,因为您的实体似乎与您的描述不匹配(没有订单日期),并且您的hbm没有发布(这将显示其他多对一关系和获取类型)。多个集合类型的急切抓取通常是重复行的罪魁祸首。IIRC、不同的根实体只是掩盖了您的问题。因为它是一个结果转换器,所以重复的行仍然会从数据库返回,但是Hibernate会过滤掉它们。这是一个有两个原因的问题:它表明您的查询不正确,并且它为不正确的连接在数据库上增加了不必要的负载。随着这些表的增长,这可能会导致性能下降。我想我对问题所在有所猜测。当我们使用crit.createAlias(“客户”、“客户”)时,hibernate可能正在进行完全连接(类似于从客户、订单中选择*)。如何在createAlias上分配限制?有点像crit.mustEqual(“customerId”、“customerId”)来强制customerId值相等(比如customer.customerId=order.customerId上的客户内部联接订单中的select*from)?