jpa - 使用 OneToMany 查询 - openJPA 与 EclipseLink

标签 jpa eclipselink openjpa

openjpa 提示 EclipseLink 正确处理的 JPA 查询的参数不正确。 EclipseLink 返回电机的验证消息集。

两个问题:
1) 我的查询是否错误,EclipseLink 仍然友好地处理它?<​​br/> 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)

三相电机输入映射

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;

验证消息映射

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;

最佳答案

检查http://docs.oracle.com/javaee/6/tutorial/doc/bnbuf.html#bnbvx - SELECT 子句:SELECT 子句不能指定集合值表达式。例如,SELECT 子句 p.teams 无效,因为 groups 是一个集合。 但是您可以使用 valMessages 进行 INNER/OUTER 连接并通过它选择 IValidationMessage 实体,例如:

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

关于jpa - 使用 OneToMany 查询 - openJPA 与 EclipseLink,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29381670/

相关文章:

java - OpenJPA 事务 - 单个或多个实体管理器?

java - JPA 继承与 JOINED 策略

java - 在 JPA/Hibernate 中使用 PK 作为 FK

java - JPA/EclipseLink 惰性集合未加载

java.sql.SQLIntegrityConstraintViolationException : Column 'ITEM_QTY' cannot accept a NULL value

java - OpenJPA 说 : You have supplied colums for FooBar but this mapping cannot have columns in this context

java - 在 JPQL 中将属性与聚合选择的结果进行比较的正确语法是什么?

jpa - 我应该使用 @NamedQuery 注释还是 addNamedQuery 方法?

java - 与额外列的多对多关联

hibernate - JPA 是否支持 @ManyToMany(mappedBy = ... ) + @OrderColumn?