【问题标题】:JPA Error joining table and viewJPA 连接表和视图时出错
【发布时间】:2016-03-01 17:47:36
【问题描述】:

我需要在 JPA 查询中加入一个表和一个视图。由于无法识别视图列,因此无法编译查询。

非常感谢任何建议。

更新了父实体和一致的命名

查询是:

select count(m.id) 
    from MultiSpeedMotor m, 
        MultiSpeedQuery q1  
    where m.id = q1.motorId 
        and q1.power = 10 

错误是:

The state field path 'q1.motorId' cannot be resolved to a valid type.
The state field path 'q1.power' cannot be resolved to a valid type.

我正在使用具有与此类似的非规范化表的旧数据库

Long motorId 
Long id  
Double hi_power 
Double lo_power 

我使用了一个带有联合查询的视图来将此表规范化为

Long motorId  
Long id 
Long hi 
Double power 

为了在 JPA 中对联合查询的视图进行建模,我使用了 @IdClass

public class MultiSpeedQueryId implements Serializable {
    private static final long serialVersionUID = -7996931190943239257L;

    private Long motorId;
    private Long id;
    private Long hi;
    ...
}

@Entity
@Table(name = "multi_speed_query")
@IdClass(MultiSpeedQueryId.class)
public class MultiSpeedQuery implements IMultiSpeedQuery {
    @Id
    @Column(name = "motor_id")
    private Long motorId;
    @Id
    private Long id;
    @Id
    private Long hi;

    private Double power;
    ...
}

父实体映射为:

@Entity
@Table(name = "multi_speed_motor")
public class MultiSpeedMotor implements Serializable, IMultiSpeedMotor {
    private static final long serialVersionUID = 3019928176257499187L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    ...
}

【问题讨论】:

  • 我不确定,但可能以下方法有效:... WHERE q1.motor = m ... 并将MultiSpeedQuery.motorId 替换为实际的MultiSpeedMotor motor
  • 我不确定您的建议。 q1 和 m 是标准 JPA 别名。
  • 根据您的表def,虽然有 parentId 列,但没有motorId ..这实际上存在于数据库中吗?如果是这样,两个表的实际表定义会很有帮助
  • 我更新了原帖,在解释中使用了实际的字段名motorId,而不是parentId。我在解释中最初使用了 parentId 以更好地表明角色。

标签: jpa


【解决方案1】:

查询是正确的。

您可以使用语法加入没有预定义关系的实体。

where a.id = b.joinField 

问题要简单得多。我错过了告诉真正问题的 JPA 错误日志的一部分。

The abstract schema type 'MultiSpeedQuery' is unknown.

一旦我将实体添加到persistence.xml 中,最初编写的查询就可以完美运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2017-12-11
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2022-09-28
    相关资源
    最近更新 更多