【问题标题】:JPA + JBOSS Hibernate NamedQuery not using column namesJPA + JBOSS Hibernate NamedQuery 不使用列名
【发布时间】:2017-12-25 03:07:25
【问题描述】:

下面是我的 JPA 实体的 sn-p。当我在 JBOSS 中使用 Hibernate DB2 方言运行它时,生成的选择查询使用 acctYymm 而不是 ACCT_YYMM 导致 -206 异常。

@Column(name = "ACCT_YYMM")
public String getAcctYymm() {
  return acctYymm;
}

SqlSyntaxErrorException:DB2 SQL 错误:SQLCODE=-206,SQLSTATE=42703,SQLERRMC=CARTUMLRE0_.ACCTYYMM,DRIVER=3.62.56

我尝试将命名策略更改为 EJB3NamingStrategy 和 DefaultComponentSafeNamingStrategy,它们似乎都没有使用列名。我认为在我实现 EmbeddedId 并加入两个表之前不会出现这个问题。会不会有什么关联?

添加我的代码:

Car 和 Pool Entity 共享 PK 可嵌入类

@Embeddable
public class PK implements Serializable {
private String acctYymm;
private String carInit;
private String carNum;

@Column(name = "ACCT_YYMM", nullable = false, length = 4)
public String getAcctYymm() {
    return acctYymm;
}

//skipping getters and setters

@Column(name = "CAR_INIT", nullable = false, length = 4)
public String getCarInit() {
    return carInit;
}

@Column(name = "CAR_NUM", nullable = false, length = 6)
public String getCarNum() {
    return carNum;
}

}

@Entity
@NamedQuery(name = "Car.findAll", query = "select umler from CarEntity umler join umler.poolEntity pool where umler.pk.acctYymm = :acctYymm and umler.pk.carInit = :carInit and umler.pk.carNum = :carNum")
@Table(name = "CART_UMLER", schema = "CARSCHEMA", catalog = "")
public class CarEntity implements Serializable{

@EmbeddedId
private PK pk = null;

public PK getPk() {
    return pk;
}

public void setPk(PK pk) {
    this.pk = pk;
}


@OneToOne
@PrimaryKeyJoinColumns({
        @PrimaryKeyJoinColumn(name="ACCT_YYMM", referencedColumnName="ACCT_YYMM"),
        @PrimaryKeyJoinColumn(name="CAR_INIT", referencedColumnName="CAR_INIT"),
        @PrimaryKeyJoinColumn(name="CAR_NUM", referencedColumnName="CAR_NUM")
})
private PoolEntity poolEntity;

private String carTyp;

@Basic
@Column(name = "CAR_TYP", nullable = false, length = 1)
public String getCarTyp() {
    return carTyp;
}

//skipping getters and setters
}

@Entity
@Table(name = "POOL", schema = "CARSCHEMA", catalog = "")
public class PoolEntity implements Serializable{

@EmbeddedId
private PK pk = null;

public PK getPk() {
    return pk;
}

public void setPk(PK pk) {
    this.pk = pk;
}

private String poolCd;

@Basic
@Column(name = "POOL_CD", nullable = false, length = 7)
public String getPoolCd() {
    return poolCd;
}

public void setPoolCd(String poolCd) {
    this.poolCd = poolCd;
}

}

【问题讨论】:

    标签: hibernate jpa


    【解决方案1】:

    如果您仔细查看您的映射,您会发现您混合了属性和基于字段的访问。

    你需要将@EmbeddedId注解从字段移到属性:

    private PK pk = null;
    
    @EmbeddedId
    public PK getPk() {
        return pk;
    }
    

    这适用于 PoolEntity poolEntity;PoolEntity pk 属性。

    您需要对这些映射保持一致,否则,Hibernate 将找不到它们。

    【讨论】:

    • 非常感谢@vlad-mihalcea。它工作得很好。我应该阅读一下访问类型。
    • 我敢打赌它值得一读。只是好奇,它有平装版吗?另外,有写一本 OpenJPA 书的计划吗? :)
    • 平装版是available on Amazon。我为什么要写带有2% market share 的框架?
    猜你喜欢
    • 2014-09-06
    • 2015-07-20
    • 2016-01-23
    • 2016-12-26
    • 2016-05-03
    • 2020-03-11
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    相关资源
    最近更新 更多