Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 冬眠标准问题_Hibernate_Criteria - Fatal编程技术网

Hibernate 冬眠标准问题

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.

假设我有两个Hibernate POJO:Customer和Order。订单表有三个相关列:customerId、totalItemsSold和totalCost。Customer表包含以下列:customerId、firstName、lastName和city

我已经在订单表和客户表之间映射了多对一。我的订单POJO包含一个客户对象。我要执行以下条件查询:

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)?