注文と注文詐欺アラートがあります。関連付けは、不正アラートから注文に対してのみ実行され、その逆は実行されません。
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");
サブクエリを使用して、この注文に関連付けられているすべての FraudAlert 名をコレクションとして取得し、それをビュー モデル Bean FraudOrderSearchViewModel に渡していることがわかります。
私の問題は、休止状態が適切なコンストラクターを見つけられず、例外をスローすることです:
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[], List List を試してみましたが、役に立ちませんでした。hibernate が使用するコンストラクター変数の型は何ですか?