Hibernate много-ко-многим сопоставление и запрос, чтобы пойти с ним - PullRequest
0 голосов
/ 18 марта 2012

У меня возникли проблемы с освоением HQL.У меня есть приложение, в котором у меня куча конкурентов за одним столом.Затем у меня есть соревнования, где я сопоставляю конкурентов.Каждое соревнование может иметь любое количество участников.И каждый участник может участвовать в нескольких соревнованиях.(На самом деле, я организовываю соревнование в формате «круговой прием», поэтому все участники будут участвовать во многих соревнованиях, чтобы убедиться, что они играют всех остальных участников.)

Вместо того, чтобы создавать объединяющий стол самостоятельно, яя пытаюсь использовать XML Hibernate для создания таблицы соединений.В конечном счете, я ДУМАЮ, что смогу написать что-то вроде следующего HQL-запроса:

select count(*)  from Competition c where c.competitor.id = :competitorId 

Простой запрос, который на самом деле является частью большего запроса.Моя цель - подсчитать количество соревнований, в которых участвует данный участник.Проблема, с которой я сталкиваюсь, это ошибки типа:

org.hibernate.QueryException: could not resolve property: competitor of: com.sodapopsoftware.imagewar.model.db.Competition [ select count(*)  from com.sodapopsoftware.imagewar.model.db.Competition c where c.competitor.id = :competitorId ]

Вот мои сопоставления для соревнований и конкурентов.

КОНКУРС

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.sodapopsoftware.imagewar.model.db.Competition" table="competition">

    <meta attribute="use-in-tostring">true</meta>
    <meta attribute="extra-import">java.util.Set</meta>
    <meta attribute="extra-import">java.util.TreeSet</meta>

    <id name="competitionId" column="competition_id" type="int">
        <meta attribute="scope-set">protected</meta>
        <meta attribute="field-description">Primary Key</meta>
        <meta attribute="use-in-equals">true</meta>
        <generator class="native" />
    </id>
    <many-to-one name="league" column="league_id" unique="false" not-null="true"
        class="com.sodapopsoftware.imagewar.model.db.League"
    />
    <property name="dateAdded" column="date_added" type="date" not-null="true">
        <meta attribute="field-description">When the league was created</meta>
    </property>
    <set name="competitors" table="competition_competitors" sort="com.sodapopsoftware.imagewar.model.util.CompetitorIdComparator">
        <meta attribute="property-type"><![CDATA[Set< Competitor >]]></meta>
        <meta attribute="default-value"><![CDATA[new TreeSet< Competitor >()]]></meta>
        <key column="competition_id"/>
        <many-to-many column="competitor_id"
            unique="false"
            class="com.sodapopsoftware.imagewar.model.db.Competitor"/>
    </set>
</class>
</hibernate-mapping>

КОНКУРЕНТ

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.sodapopsoftware.imagewar.model.db.Competitor" table="competitor">

    <meta attribute="use-in-tostring">true</meta>
    <meta attribute="extra-import">java.lang.Comparable</meta>
    <meta attribute="implements">Comparable<![CDATA[<]]> Competitor <![CDATA[>]]></meta>
    <meta attribute="class-code">    private static final long serialVersionUID = 1L;</meta>
    <meta attribute="class-code">
public int compareTo( Competitor that ) {
    if ( that != null ) {
        return this.getCompetitorId() - that.getCompetitorId();
    }
    return 1;
}
    </meta>
    <id name="competitorId" column="competitor_id" type="int">
        <meta attribute="scope-set">protected</meta>
        <meta attribute="use-in-equals">true</meta>
        <generator class="native" />
    </id>
    <many-to-one name="league" column="league_id" unique="false" not-null="true"
        class="com.sodapopsoftware.imagewar.model.db.League"
    />
    <property name="name" column="name" type="string" not-null="true">
        <meta attribute="field-description">Gives this competitor a name</meta>
    </property>
    <property name="nameNormalized" column="name_normalized" unique="true" type="string" not-null="true">
        <meta attribute="field-description">Same as name, but lower case for searching</meta>
    </property>
    <property name="description" column="description" type="string">
        <meta attribute="field-description">Describes this competitor</meta>
    </property>
    <property name="linkImageThumbnail" column="link_image_thumbnail" type="string" not-null="true">
        <meta attribute="field-description">Link to the thumbnail image for this competitor</meta>
    </property>
    <property name="linkImageFullSized" column="link_image_full_sized" type="string" not-null="true">
        <meta attribute="field-description">Link to the full-sized image for this competitor</meta>
    </property>
    <property name="dateAdded" column="date_added" type="date" not-null="true">
        <meta attribute="field-description">When the competitor was created</meta>
    </property>
</class>
</hibernate-mapping>

1 Ответ

2 голосов
/ 19 марта 2012

в вашем запросе используется синтаксис для ссылок (ManyToOne), но для одно / много ко многим требуется явное соединение, чтобы иметь псевдоним для элементов

select count(*)  from Competition c join c.competitors co where co.id = :competitorId
...