2015-04-01 3 views
2

openjpa жалуется на неправильный аргумент для запроса JPA, который правильно обрабатывает EclipseLink. 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

Check http://docs.oracle.com/javaee/6/tutorial/doc/bnbuf.html#bnbvx - Предложение SELECT: предложение SELECT не может указывать выражение, основанное на коллекции. Например, предложение SELECT p.teams недействительно, потому что команды - это коллекция. Но вы можете использовать valMessages для INNER/OUTER присоединиться и выберите IValidationMessage объекты корыто это, например .:

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

Спасибо! Я думал, что попробовал это до публикации, но не должен, потому что ваш код работал в первый раз. –

Смежные вопросы