当前位置: 首页 > 知识库问答 >
问题:

尝试构建hibernate条件查询时出现的问题,该查询通过与联接表实体和复合键的多对多关联进行导航

隗新霁
2023-03-14

你能帮我解决这个问题吗?

以下是相关代码摘录:

帐户:

@Entity
@Table(name = "account")
public class Account {

    private Long accountId;
    private List<AccountAttribut> accountAttributes = new LinkedList<AccountAttribut>();
    private Person person;
    private Zielsystem zielsystem;

    public Account() {
    }
    // ...
}
@Entity
@Table(name="account_attribut")
@AssociationOverrides({
    @AssociationOverride(name="aa_pk.account", joinColumns = @JoinColumn(name="account_id")),
    @AssociationOverride(name="aa_pk.attribut", joinColumns = @JoinColumn(name="attribut_id"))
})
public class AccountAttribut {}
private AccountAttributPk aa_pk = new AccountAttributPk();

@Column(name="wert")
private String wert;

@EmbeddedId
public AccountAttributPk getAa_pk() {
    return aa_pk;
}

public void setAa_pk(AccountAttributPk aa_pk) {
    this.aa_pk = aa_pk;
}

@Transient
public Account getAccount() {
    return getAa_pk().getAccount();
}

public void setAccount(Account account) {
    getAa_pk().setAccount(account);
}

@Transient
public Attribut getAttribut() {
    return getAa_pk().getAttribut();
}

public void setAttribut(Attribut attribut) {
    getAa_pk().setAttribut(attribut);
}

public String getWert() {
    return wert;
}

public void setWert(String wert) {
    this.wert = wert;
}

public boolean equals(Object o) {
     if (this== o) return true;
     if (o ==null|| getClass() != o.getClass()) return false;

     AccountAttribut that = (AccountAttribut) o;

     if (getAa_pk() !=null?!getAa_pk().equals(that.getAa_pk()) : that.getAa_pk() !=null) return false;

     return true;
}

 public int hashCode() {
     return (getAa_pk() !=null? getAa_pk().hashCode() : 0);
 }
}
@Embeddable
public class AccountAttributPk implements Serializable {

    private static final long serialVersionUID = -1551814445010872872L;
    private Account account;
    private Attribut attribut;

    @ManyToOne
    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }

    @ManyToOne
    public Attribut getAttribut() {
        return attribut;
    }

    public void setAttribut(Attribut attribut) {
        this.attribut = attribut;
    }

    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;

        AccountAttributPk that = (AccountAttributPk) o;

        if (account != null ? !account.equals(that.account) : that.account != null)
            return false;
        if (attribut != null ? !attribut.equals(that.attribut)
                : that.attribut != null)
            return false;

        return true;
    }

    public int hashCode() {
        int result;
        result = (account != null ? account.hashCode() : 0);
        result = 31 * result + (attribut != null ? attribut.hashCode() : 0);
        return result;
    }
}
List<Account> queried_accounts = HibernateUtils.criteriaList(
   session.createCriteria(Account.class).
      createCriteria("accountAttributes").
         createCriteria("aa_pk.attribut").
            add(Restrictions.isNotNull("name"))
);

例外情况:

org.hibernate.exception.sqlgrammarexception:无法提取org.hibernate.exception.internal.sqlexceptiontypedelegate.convert(sqlexceptiontypedelegate.java:80)(org.hibernate.exception.internal.standardsqlexceptionconverter.convert(standardsqlexceptionconverter.java:49)上的ResultSet

我尝试了以下几种解决方案:

List<Account> queried_accounts = HibernateUtils.criteriaList(
   session.createCriteria(Account.class).
      createCriteria("accountAttributes","accAttrAlias").
       createCriteria("accAttrAlias.aa_pk","accAttrAAPKAlias").
         createCriteria("accAttrAAPKAlias.attribut", "attrAlias").
            add(Restrictions.isNotNull("attrAlias.name"))
);

Java错误日志:org.hibernate.QueryException:不能直接在组件上创建条件html" target="_blank">对象。创建一个拥有实体的条件,并使用一个带点的属性访问组件属性:AccountAttributes.aa_pk

List<Account> queried_accounts = HibernateUtils.criteriaList(
   session.createCriteria(Account.class).
      createCriteria("accountAttributes","accAttrAlias").
         createCriteria("accAttrAlias.aa_pk.attribut", "attrAlias").
            add(Restrictions.isNotNull("attrAlias.name"))
);

Java错误日志:org.hibernate.exception.sqlgrammarexception:无法提取ResultSet

Hibernate错误日志:“Hibernate:选择this_.account_id作为account_1_3_4_,this_.person_id作为person_i2_3_4_,this_.zielsystem_id作为zielsystem_3_3_4_,accattrali1_.account_id作为account_3_4__,accattrali1_.attribut_id作为attribut_2_4_0_,accattrali1_.attribut_id作为attribut_2_4_0_,accattrali1_.attribut_wert作为s2_.name不为null Feb 20 2014 11:25:11 PM org.hibernate.engine.jdbc.spi.sqlexceptionhelper logExceptions警告:SQL错误:1054,SqlState:42s22 Feb 20 2014 11:25:11 PM org.hibernate.engine.jdbc.spi.sqlexceptionhelper logExceptions错误:“WHERE子句”中的列“attralias2_.name”未知“

共有1个答案

容磊
2023-03-14

标准应该与以下变量类似

List<Account> queried_accounts = HibernateUtils.criteriaList(
   session.createCriteria(Account.class).
      createCriteria("accountAttribute","accAttrAlias").
         createCriteria("accAttrAlias.ATTRIBUTE_VARIABLE_NAME", "attrAlias").
            add(Restrictions.isNotNull("attrAlias.name"))
);

以下是标准文档

更新

List<Account> queried_accounts = HibernateUtils.criteriaList(
   session.createCriteria(Account.class).
      createCriteria("accountAttribute","accAttrAlias").
       createCriteria("accAttrAlias.aa_pk","accAttrAAPKAlias").
         createCriteria("accAttrAAPKAlias.attribut", "attrAlias").
            add(Restrictions.isNotNull("attrAlias.name"))
);
List<Account> queried_accounts = HibernateUtils.criteriaList(
   session.createCriteria(Account.class).
      createCriteria("accountAttribute","accAttrAlias").
         createCriteria("accAttrAlias.aa_pk.attribut", "attrAlias").
            add(Restrictions.isNotNull("attrAlias.name"))
);
 类似资料:
  • 问题内容: 所以我昨天问了这个问题,但是目标职位已经改变,问题有所不同: Hibernate /JPA元素集合具有多对多关系吗? 我想知道是否可以创建将对所需关系进行建模的实体,以便Hibernate在启动应用程序时创建我的架构。 关键是Join表实际上可以包含不链接到任何Elements的行。该结构表示基于“类型”和“值”对的元素分类,并输入到此特定应用程序之外的系统中。 我想做的是通过映射将我

  • subcompany.hbm.xml 子单位表 branch.java 指定表 我需要帮助编写条件查询使用提供的SQL。

  • 主要内容:示例实际应用中,由于多对多的关系比较复杂,会增加理解和关联的复杂度,所以应用较少。MyBatis 没有实现多对多级联,推荐通过两个一对多级联替换多对多级联,以降低关系的复杂度,简化程序。 例如,一个订单可以有多种商品,一种商品可以对应多个订单,订单与商品就是多对多的级联关系。可以使用一个中间表(订单记录表)将多对多级联转换成两个一对多的关系。 示例 下面以订单和商品(实现“查询所有订单以及每个订单对应

  • 我想管理与映射到联接表的实体的关系。因此我有3个实体类:、、。具有注释的和成员。 及其嵌入的密钥: 当我需要带有给定标记的帖子时,我希望使用以下查询: 整件事都在这里: https://github.com/riskop/jpa_hibernate_spring_boot_many_to_many_managed_on_join_table_problem

  • Hibernate5.2.10 查询DSL(jpa,apt)4.1.4 Spring Boot 1.5.6 Spring Data JPA(因此,使用存储库) 存储库扩展 选择以下meetupCampaign.id=x *meetupCampaign.ApprovalStatus=y的关联会议: *meetupCampaign.id=x *meetupCampaign.ApprovalStatus

  • 有没有办法在没有显式连接的实体上编写条件查询?通过显式连接,我的意思是数据库中的两个表没有外键关系,但一些列需要从两个表中提取,因此在查询中需要连接。我知道具有join的查询可以用‘In’子句编写,而条件查询可以用‘In’条件编写。我已经写了这种情况下的HQL,但请告诉我如何编写这种情况下的标准查询。 先谢谢了