【问题标题】:org.hibernate.QueryException: could not resolve property username of: it.unibo.bd.ucm.model.bankaccounts.entity.BankAccountorg.hibernate.QueryException:无法解析属性用户名:it.unibo.bd.ucm.model.bankaccounts.entity.BankAccount
【发布时间】:2016-10-03 19:32:34
【问题描述】:

我正在尝试选择客户(可能是私人或公司)拥有的所有银行账户。

Customer类代码:

@Entity
@Table(name = "customers")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
@Getter
@Setter
@NoArgsConstructor
public class Customer implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(unique = true, nullable = false, length = 15)
    @NonNull
    private String username;

    @Column(nullable = false, length = 64)
    @NonNull
    private String password;

    @Column(name = "street_name", unique = true, nullable = false, length = 50)
    @NonNull
    private String streetName;

    @Column(name = "house_number", nullable = false)
    private int houseNumber;

    @ManyToMany(targetEntity = Customer.class, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(
            name = "ownership_ba",
            joinColumns = {
                @JoinColumn(name = "customer_username", referencedColumnName = "username")})
    @NonNull
    private Set<BankAccount> bankAccounts;

}

BankAccount类代码:

@Entity
@Table(name = "bank_accounts")
@Getter
@Setter
@NoArgsConstructor
public class BankAccount implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(unique = true, nullable = false)
    private String iban;

    @Column(nullable = false)
    private double balance;

    @ManyToMany(targetEntity = BankAccount.class, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(
            name = "ownership_ba",
            joinColumns = {
                @JoinColumn(name = "bank_account_iban", referencedColumnName = "iban")})
    @NonNull
    private Set<Customer> customers;

}

HQL 查询:

SELECT b FROM BankAccount b JOIN b.customers c WHERE c.username = :username

这是错误日志:

org.hibernate.QueryException: could not resolve property: username of: it.unibo.bd.ucm.model.bankaccounts.entity.BankAccount [SELECT b FROM it.unibo.bd.ucm.model.bankaccounts.entity.BankAccount b JOIN b.customers c WHERE c.username = 'niklegend2']
    at org.hibernate.QueryException.generateQueryException(QueryException.java:137)
    at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:120)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:234)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:126)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:88)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:190)
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1796)
    at it.unibo.bd.ucm.controller.ControllerImpl.executeQuery(ControllerImpl.java:235)
    at it.unibo.bd.ucm.controller.ControllerImpl.BAList(ControllerImpl.java:51)
    at it.unibo.bd.ucm.controller.ControllerImpl.main(ControllerImpl.java:262)
Caused by: org.hibernate.QueryException: could not resolve property: username of: it.unibo.bd.ucm.model.bankaccounts.entity.BankAccount
    at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83)
    at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:77)
    at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1978)
    at org.hibernate.persister.collection.AbstractCollectionPersister.toType(AbstractCollectionPersister.java:1601)
    at org.hibernate.hql.internal.ast.tree.FromElementType.getPropertyType(FromElementType.java:367)
    at org.hibernate.hql.internal.ast.tree.FromElement.getPropertyType(FromElement.java:500)
    at org.hibernate.hql.internal.ast.tree.DotNode.getDataType(DotNode.java:649)
    at org.hibernate.hql.internal.ast.tree.DotNode.prepareLhs(DotNode.java:272)
    at org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:219)
    at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:126)
    at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:121)
    at org.hibernate.hql.internal.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:945)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1264)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4639)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:4111)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2096)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:794)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:595)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
    ... 10 more

为什么 Hibernate 试图在 BankAccount 类中查找用户名字段?

更新:我们解决了问题,基本上@ManyToMany BankAccount 类的 targetEntity 应该是 Customer,而 Customer 应该是 BankAccount

【问题讨论】:

  • 当你加入两个实体时,你必须加入一些共同的列,这两个实体都存在。可能是我的客户?
  • 我们正在使用一个名为 ownership_ba 的连接表,其中包含 customer_usernamebank_account_iban
  • 我稍微清理了代码,删除了所有与问题无关的字段

标签: java hibernate hql


【解决方案1】:

使用FetchType.EAGER in Set&lt;Customer&gt;,它将在加载实体银行对账单时加载客户。

LAZY = fetch when needed
EAGER = fetch immediately

fetch=FetchType.LAZY 级联后应该如下所示

@ManyToMany(targetEntity = BankAccount.class, cascade = {CascadeType.PERSIST, CascadeType.MERGE},fetch=FetchType.LAZY)
@JoinTable(
        name = "ownership_ba",
        joinColumns = {
            @JoinColumn(name = "bank_account_iban", referencedColumnName = "iban")})
@NonNull
private Set<Customer> customers;

【讨论】:

    猜你喜欢
    • 2014-02-24
    • 2013-07-25
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多