2013-01-07 25 views
1

我有訂單和訂單欺詐警報。該關聯只能從欺詐警報到訂單,而不是相反。Hibernate/JPA查詢語言具有子查詢的新實體構造函數 - 無法找到合適的構造函數

public class FraudAlerts 
... 
@ManyToOne 
@JoinColumn(name = "customerOrderId") 
private CustomerOrder customerOrder; 

我的查詢是這樣的:

"select new com.acme.struts.search.FraudOrderSearchViewModel" 
+ "(co.orderId, co.orderPlacedDate, tot.totalIncVat, adr.email, co.customerNumber, co.ipAddress, " 
+ "(select name from FraudAlerts where co.orderId = customerOrder))" 
+ " from CustomerOrder as co join co.customerBillTo adr join co.originalTotal as tot"); 

你可以看到我使用子查詢來獲取被accociated這個順序作爲一個集合所有fraudAlert名稱和傳遞給視圖模型bean FraudOrderSearchViewModel。

我的問題是,Hibernate不會爲它找到合適的構造函數,並拋出一個異常:

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate appropriate constructor on class [com.acme.struts.search.FraudOrderSearchViewModel] [select new com.acme.struts.search.FraudOrderSearchViewModel(co.orderId, co.orderPlacedDate, tot.totalIncVat, adr.email, co.customerNumber, co.ipAddress, (select name from com.acme.data.model.fraud.FraudAlerts where co.orderId = customerOrder)) from com.acme.data.model.customer.CustomerOrder as co join co.customerBillTo adr join co.originalTotal as tot] 
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1364) 
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300) 
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:294) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) 
at $Proxy65.createQuery(Unknown Source) 
at com.acme.services.fraud.FraudHibQueryTest.testFraudServiceHibQuery(FraudHibQueryTest.java:72) 

我的構造函數如下:

public FraudOrderSearchViewModel(final String orderId, final Date datePlaced, final BigDecimal originalTotal, final String customerEmail, final String customerId, 
     final String ipAddress, final Object[] holdReason) 

我試過的String [],列表列出無濟於事。 hibernate希望我使用什麼類型的構造函數變量?

回答

1

我發現我剛剛在關係模型中遇到了限制。我試圖獲取數據庫行的列表,其中每個行將包含一個由另一個表中的多行組成的列。對於一個查詢是不可能的。

-1

您的休眠實體FraudOrderSearchViewModel應該有一個默認的無參數構造函數。

+0

謝謝,但它有一個,這不是問題。類似的查詢不涉及子查詢,只有簡單的類型,都可以很好地工作。 –

-1

此問題的一個原因是您從查詢中的表中檢索列的順序。它必須與構造函數中的相同。

相關問題