Java 具有@OneToMany双向关联的Hibernate映射映射

Java 具有@OneToMany双向关联的Hibernate映射映射,java,hibernate,Java,Hibernate,我在尝试使用具有双向关联的实体时遇到查询问题 我有一个实体钱包,它与另外两个实体有一些关系。与实体WalletBranchofice的关系存在问题。如果我对代码的这一部分进行注释,则一切正常。以下是我的实体: Wallet.java @Entity @Table(name="WALLET", schema=SchemasConfig.SCHEMA_NEW) @Cacheable(true) @Cache(usage=CacheConcurrencyStrategy.READ_ONLY) publ

我在尝试使用具有双向关联的实体时遇到查询问题

我有一个实体钱包,它与另外两个实体有一些关系。与实体WalletBranchofice的关系存在问题。如果我对代码的这一部分进行注释,则一切正常。以下是我的实体:

Wallet.java

@Entity
@Table(name="WALLET", schema=SchemasConfig.SCHEMA_NEW)
@Cacheable(true)
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
public class Wallet implements Serializable {

private static final long serialVersionUID = 3307006915060155334L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="WALLET_ID")
private Integer walletId;
public Integer getWalletId() {
    return walletId;
}

@Column(name="INTERNAL_REFERENCE", nullable=false, length=32)
private String internalReference;
public String getInternalReference() {
    return internalReference;
}

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="CURRENCY_ID", nullable=false)
private Currency currency;
public Currency getCurrency() {
    return currency;
}

@Column(name = "CACHE_AMOUNT_SUM", nullable = false, precision = 13, scale = 2)
private BigDecimal cacheAmountSum;
public BigDecimal getCacheAmountSum() {
    return cacheAmountSum;
}

@OneToMany(mappedBy="wallet", fetch=FetchType.EAGER)
@MapKeyColumn(name="BRANCH_OFFICE_ID")
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
private Map<Integer, WalletBranchOffice> walletBranchOffices;
public Map<Integer, WalletBranchOffice> getWalletBranchOffices() {
    return walletBranchOffices;
}

@OneToMany(mappedBy="wallet", fetch=FetchType.EAGER)
@MapKeyColumn(name="WALLET_PREV_ID")
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
/*
 * wallets which must be used before current wallet
 */
private Map<Integer, WalletDependency> walletDependencies;
public Map<Integer, WalletDependency> getWalletDependencies() {
    return walletDependencies;
}

@OneToMany(mappedBy="walletPrev", fetch=FetchType.EAGER)
@MapKeyColumn(name="WALLET_ID")
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
/*
 * wallets that can be used after current wallet
 */
private Map<Integer, WalletDependency> dependentWallets;
public Map<Integer, WalletDependency> getDependentWallets() {
    return dependentWallets;
}

@Column(name = "TEXT_KEY")
private String textKey;
public String getTextKey() {
    return textKey;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result
            + ((walletId == null) ? 0 : walletId.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Wallet other = (Wallet) obj;
    if (walletId == null) {
        if (other.walletId != null)
            return false;
    } else if (!walletId.equals(other.walletId))
        return false;
    return true;
}
}
这是WalletDependency.java,它没有问题

@Entity
@Table(name="WALLET_DEPENDENCY",schema=SchemasConfig.SCHEMA_NEW)
@Cacheable
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
@Immutable
public class WalletDependency implements Serializable {

private static final long serialVersionUID = -6665047739101469610L;

@Id
@Column(name="WALLET_DEPENDENCY_ID")
private Integer walletRequiredId;
public Integer getWalletRequiredId() {
    return walletRequiredId;
}

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="WALLET_ID", nullable=false)
private Wallet wallet;
public Wallet getWallet() {
    return wallet;
}

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="WALLET_PREV_ID",nullable=false)
private Wallet walletPrev;
public Wallet getWalletPrev() {
    return walletPrev;
}   
}
我的问题是,如果我执行一个简单的select查询,比如:

List<Wallet> wallets  = em.createQuery("FROM Wallet AS  w",Wallet.class).getResultList(); 
List wallets=em.createQuery(“以w的形式从钱包”,Wallet.class).getResultList();
使用EntityManager,我得到一个SQL语法错误:

Caused by: java.sql.SQLSyntaxErrorException: [SQL0199] Keyword AS not expected. Valid tokens: , FROM INTO.
at com.ibm.as400.access.JDError.createSQLExceptionSubClass(JDError.java:852) [jt400-7.9_jdbc4.0.jar:JTOpen 7.9]
at com.ibm.as400.access.JDError.throwSQLException(JDError.java:692) [jt400-7.9_jdbc4.0.jar:JTOpen 7.9]
at com.ibm.as400.access.JDError.throwSQLException(JDError.java:662) [jt400-7.9_jdbc4.0.jar:JTOpen 7.9]
at com.ibm.as400.access.AS400JDBCStatement.commonPrepare(AS400JDBCStatement.java:1763) [jt400-7.9_jdbc4.0.jar:JTOpen 7.9]
at com.ibm.as400.access.AS400JDBCPreparedStatement.<init>(AS400JDBCPreparedStatement.java:354) [jt400-7.9_jdbc4.0.jar:JTOpen 7.9]
at com.ibm.as400.access.AS400JDBCConnection.prepareStatement(AS400JDBCConnection.java:2166) [jt400-7.9_jdbc4.0.jar:JTOpen 7.9]
at com.ibm.as400.access.AS400JDBCConnection.prepareStatement(AS400JDBCConnection.java:2108) [jt400-7.9_jdbc4.0.jar:JTOpen 7.9]
at org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnection.doPrepareStatement(BaseWrapperManagedConnection.java:732)
at org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnection.prepareStatement(BaseWrapperManagedConnection.java:707)
at org.jboss.jca.adapters.jdbc.WrappedConnection.prepareStatement(WrappedConnection.java:404)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:161) [hibernate-core-4.2.0.Final-redhat-1.jar:4.2.0.Final-redhat-1]
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:182) [hibernate-core-4.2.0.Final-redhat-1.jar:4.2.0.Final-redhat-1]
... 163 more
由以下原因引起:java.sql.SQLSyntaxErrorException:[SQL0199]关键字不是预期的。有效令牌:,从到。
在com.ibm.as400.access.jderro.createSQLExceptionSubClass(jderro.java:852)[jt400-7.9\u jdbc4.0.jar:JTOpen 7.9]
在com.ibm.as400.access.jderro.throwSQLException(jderro.java:692)[jt400-7.9_jdbc4.0.jar:JTOpen 7.9]
在com.ibm.as400.access.jderro.throwSQLException(jderro.java:662)[jt400-7.9_jdbc4.0.jar:JTOpen 7.9]
在com.ibm.as400.access.AS400JDBCStatement.commonPrepare(AS400JDBCStatement.java:1763)[jt400-7.9_jdbc4.0.jar:JTOpen 7.9]
在com.ibm.as400.access.as400jdbpreparedstatement.(as400jdbpreparedstatement.java:354)[jt400-7.9_jdbc4.0.jar:JTOpen 7.9]
在com.ibm.as400.access.AS400JDBCConnection.prepareStatement(AS400JDBCConnection.java:2166)[jt400-7.9_jdbc4.0.jar:JTOpen 7.9]
在com.ibm.as400.access.AS400JDBCConnection.prepareStatement(AS400JDBCConnection.java:2108)[jt400-7.9_jdbc4.0.jar:JTOpen 7.9]
位于org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnection.dopreparement(BaseWrapperManagedConnection.java:732)
位于org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnection.prepareStatement(BaseWrapperManagedConnection.java:707)
在org.jboss.jca.adapters.jdbc.WrappedConnection.prepareStatement上(WrappedConnection.java:404)
在org.hibernate.engine.jdbc.internal.StatementPrepareImpl$5.doPrepare(statementPrepareImpl.java:161)[hibernate-core-4.2.0.Final-redhat-1.jar:4.2.0.Final-redhat-1]
在org.hibernate.engine.jdbc.internal.StatementPrepareImpl$StatementPreparationTemplate.prepareStatement(statementPrepareImpl.java:182)[hibernate-core-4.2.0.Final-redhat-1.jar:4.2.0.Final-redhat-1]
... 163更多

不需要
AS

List<Wallet> wallets  = em.createQuery("FROM Wallet w",Wallet.class).getResultList();
List wallets=em.createQuery(“来自Wallet w”,Wallet.class).getResultList();
一些例子:


谢谢您的重播!!!打印出生成的SQL后,我发现了问题。这只是一个愚蠢的技术错误。映射createDatetime属性以在WalletBranchOffice实体中创建_datetime列时缺少“_”符号。
@列(name=“CREATE DATETIME”)

否,这不是错误的原因。在JPQL中,关键字AS是可选的。即使没有查询,我也会得到同样的错误。你能打印出在这两种情况下生成的SQL吗,无论它何时工作,何时不工作?如果直接在您的数据库上执行SQL,SQL是否工作?谢谢您的重播!!!打印出生成的SQL后,我发现了问题。这只是一个愚蠢的技术错误。映射createDatetime属性以在WalletBranchOffice实体中创建_datetime列时缺少“_”符号@列(name=“CREATE DATETIME”)@Type(Type=“com.uniqagroup.ims.common.EETDateType$TimestampType”)私有时间戳createDatetime;公共时间戳getCreateDatetime(){return createDatetime;}
List<Wallet> wallets  = em.createQuery("FROM Wallet w",Wallet.class).getResultList();