我有两个数据库表客户和项目与1 -〉多关系。从数据库中提取数据,我使用以下查询。
选择customer.id,customer.name,项目.项目名称,项目.项目来自测试数据库的价格.客户内部联接项目ON项目.客户ID = customer.id
我有一个实体类Customers
@Entity
public class Customer{
@Id
private int id;
@Column
private String name;
@Column
private String itemName;
@Column
private int itemPrice;
public Customer() {}
//Getter and setter are here
.......
}
在服务类中,我有以下代码。
@GET @Path("/getCustomerInfo")
@Produces(MediaType.APPLICATION_JSON)
public List getCustomerInfo() {
CustomerDao dao = new CustomerDao();
return dao.getBuildingsCustomerInfo();
}
在我的DAO类中,我有以下代码
public List<Customer> getCustomerInfo(){
Session session = SessionUtil.getSession();
String queryString = "the above mentioned query";
List<Customer> customerInfo = session.createNativeQuery(queryString, Customer.class) ;
session.close();
return customerInfo;
}
我从服务得到以下JSON响应
[id:1, name:"Alfred", itemName:"jeans", itemprice:10],[id:1, name:"Alfred", itemName:"jeans", itemprice:10],[id:2, name:"James", itemName:"watch", itemPrice:20 ],[id:2, name:"James", itemName:"watch", itemPrice:20 ], [id:2, name:"James", itemName:"watch", itemPrice:20 ]
结果数为5,这是正确的,但第2个结果是第1个的副本,第4个和第5个结果是第3个的副本。在第2个、第4个和第5个结果中,itemName和itemPrice应该不同。
如果我使用createSQLQuery(queryString);
而不是createNativeQuery(queryString, Customer.class);
,我会得到正确的结果,但没有实体属性名称。
[1, "Alfred", "jeans", 10],[1, "Alfred", "shirt", 15],[2, "James", "watch", 20], [2, "James", "coffee", 25], [2, "James", "drinks", 30]
我看了很多文章,但找不到解决方案。我必须使用createNativeQuery()而不是createSQLQuery(),因为我需要Map实体类属性。如果我做错了,请告诉我。
3条答案
按热度按时间wz8daaqr1#
您的数据结构在Java端是错误的,与数据库关系不对应。在您描述的关系中,您需要有一个项目列表:
在项目方面:
然后,如果您真的以这种方式构造JSON数据,则需要第三个Entity类来用作ResultSetMapping。
然后,您可以在named variant中使用原生查询,这应该会提供一些轻微的优化。
使用
@SqlResultSetMapping
是为了不监视返回的实体的变化,但是您仍然可以使用定义的实体作为结果。我相信根据JPA规范,它在没有它的情况下也应该工作,但是在Hibernate中它不工作。可能是一个bug,或者是一个计划好的,但是没有实现的特性,或者我可能只是误解了JPA的用法,但是这个解决方案确实可以在Hibernate 5+中工作。cetgtptt2#
不确定重复背后的确切原因,但
SELECT DISTINCT
将解决您的问题,因为它将只采取不同的记录。参考using-distinct-in-jpa
bkkx9g8r3#
我使用@SqlResultSetMapping解决了这个问题