2015-04-01 107 views
2

openjpa抱怨EclipseLink正確處理的JPA查詢的參數不正確。 EclipseLink將返回電機的驗證消息集。使用OneToMany進行查詢 - openJPA vs EclipseLink

兩個問題:
1)我的查詢是否錯誤,EclipseLink是否善意地處理它?
2)關於如何重構openjpa查詢的任何建議?

感謝您考慮我的問題!

查詢

SELECT m.valMessages FROM ThreePhaseMotorInput m WHERE m.id = :id 

實際OpenJPA的例外

Caused by: <openjpa-2.3.0-r422266:1540826 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: 
Query projections cannot include array, collection, or map fields. 
Invalid query: "SELECT m.valMessages FROM ThreePhaseMotorInput m WHERE m.id = :id" 
    at org.apache.openjpa.kernel.ExpressionStoreQuery$AbstractExpressionExecutor.assertNotContainer(ExpressionStoreQuery.java:328) 
    at org.apache.openjpa.kernel.ExpressionStoreQuery$DataStoreExecutor.<init>(ExpressionStoreQuery.java:770) 
    at org.apache.openjpa.kernel.ExpressionStoreQuery.newDataStoreExecutor(ExpressionStoreQuery.java:179) 
    at org.apache.openjpa.kernel.QueryImpl.createExecutor(QueryImpl.java:749) 
    at org.apache.openjpa.kernel.QueryImpl.compileForDataStore(QueryImpl.java:707) 
    at org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:689) 
    at org.apache.openjpa.kernel.QueryImpl.compile(QueryImpl.java:589) 
    at org.apache.openjpa.persistence.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:1038) 
    at org.apache.openjpa.persistence.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:1017) 

ThreePhaseMotorInput映射

public class ThreePhaseMotorInput implements IThreePhaseMotorInput, Serializable { 
    private static final long serialVersionUID = 8084370807289186987L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    @Version 
    private Integer version; 
    private Integer status; 

    @OneToOne(cascade = CascadeType.ALL, optional = true, targetEntity = UnapprovedThreePhaseMotor.class) 
    @JoinColumn(name = "unapproved_id") 
    private IThreePhaseMotor unapprovedMotor; 

    @OneToOne(cascade = CascadeType.ALL, optional = true, targetEntity = ApprovedThreePhaseMotor.class) 
    @JoinColumn(name = "approved_id") 
    private IThreePhaseMotor approvedMotor; 

    @OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = ValidationMessage.class) 
    @JoinColumn(name = "input_id", referencedColumnName = "id", nullable = false) 
    @OrderColumn(name = "idx") 
    private List<IValidationMessage> valMessages; 

ValidationMessage映射

public class ValidationMessage implements Serializable, IValidationMessage { 
    private static final long serialVersionUID = 8765213112015434057L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    @Column(name = "record_id") 
    private Long recordId; 
    @Column(name = "field_name") 
    private String fieldName; 
    @Column(name = "validation_msg") 
    private String validationMsg; 
    private Integer status; 
    @Column(name = "fail_field") 
    private String failField; 
    @Column(name = "error_source") 
    private Integer errorSource; 

回答

3

檢查http://docs.oracle.com/javaee/6/tutorial/doc/bnbuf.html#bnbvx - SELECT子句:SELECT子句無法指定集合值表達式。例如,SELECT子句p.teams無效,因爲團隊是一個集合。 但是你可以使用內部/外部連接,並選擇IValidationMessage實體槽它valMessages,例如:

SELECT ivm 
    FROM ThreePhaseMotorInput tpmi 
INNER JOIN tpmi.valMessages ivm 
WHERE tpmi.id = :id 
+0

謝謝!我以爲我在發佈前嘗試過,但不能有,因爲你的代碼第一次工作。 – 2015-04-01 15:32:59