繁体   English   中英

在HQL中使用INNER JOIN

[英]Using INNER JOIN with HQL

我试图在HQl查询中使用内部联接,但是它不起作用。

SQL查询为:

SELECT A.first_name, F.title 
FROM film_actor X INNER JOIN actor A ON X.actor_id=A.actor_id
INNER JOIN film F ON F.film_id=X.film_id

它工作完美,但是当我在HQL中使用相同的功能时:

SELECT A.firstName, F.title 
FROM FilmActor X INNER JOIN Actor A ON X.actorId=A.actorId 
INNER JOIN Film F ON F.filmId=X.filmId

它显示此错误:

org.hibernate.QueryException: outer or full join must be followed by path 
expression [SELECT A.firstName, F.title 
FROM sakila.entity.FilmActor X INNER JOIN Actor A ON X.actorId=A.actorId 
INNER JOIN Film F ON F.filmId=X.filmId]

另一个HQL:

SELECT A.firstName, F.title 
FROM FilmActor as X INNER JOIN X.actorId as actor
INNER  JOIN X.filmId as film

错误:

org.hibernate.QueryException: could not resolve property: actorId of: 
sakila.entity.FilmActor [SELECT A.firstName, F.title 
FROM sakila.entity.FilmActor as X INNER JOIN X.actorId as actor
INNER  JOIN X.filmId as film]

我尝试了一个新的查询

SELECT A.firstName, F.title 
FROM Actor A, Film F, FilmActor as X  INNER JOIN X.actor as actor 
INNER JOIN X.film as film

这不是我真正需要的,但它的联接查询正常工作,因此可以开始...

演员映射:

<?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">
<!-- Generated 22-feb-2018 15:04:57 by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="sakila.entity.Actor" table="actor" catalog="sakila"     optimistic-lock="version">
    <id name="actorId" type="java.lang.Short">
        <column name="actor_id" />
        <generator class="identity" />
    </id>
    <property name="firstName" type="string">
        <column name="first_name" length="45" not-null="true" />
    </property>
    <property name="lastName" type="string">
        <column name="last_name" length="45" not-null="true" />
    </property>
    <property name="lastUpdate" type="timestamp">
        <column name="last_update" length="19" not-null="true" />
    </property>
    <set name="filmActors" table="film_actor" inverse="true" lazy="true"         fetch="select">
        <key>
            <column name="actor_id" not-null="true" />
        </key>
        <one-to-many class="sakila.entity.FilmActor" />
    </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">
<!-- Generated 22-feb-2018 15:04:57 by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="sakila.entity.Film" table="film" catalog="sakila"     optimistic-lock="version">
    <id name="filmId" type="java.lang.Short">
        <column name="film_id" />
        <generator class="identity" />
    </id>
    <many-to-one name="languageByLanguageId" class="sakila.entity.Language"         fetch="select">
        <column name="language_id" not-null="true" />
    </many-to-one>
    <many-to-one name="languageByOriginalLanguageId"     class="sakila.entity.Language" fetch="select">
        <column name="original_language_id" />
    </many-to-one>
    <property name="title" type="string">
        <column name="title" not-null="true" />
    </property>
    <property name="description" type="string">
        <column name="description" length="65535" />
    </property>
    <property name="releaseYear" type="date">
        <column name="release_year" length="0" />
    </property>
    <property name="rentalDuration" type="byte">
        <column name="rental_duration" not-null="true" />
    </property>
    <property name="rentalRate" type="big_decimal">
        <column name="rental_rate" precision="4" not-null="true" />
    </property>
    <property name="length" type="java.lang.Short">
        <column name="length" />
    </property>
    <property name="replacementCost" type="big_decimal">
        <column name="replacement_cost" precision="5" not-null="true" />
    </property>
    <property name="rating" type="string">
        <column name="rating" length="5" />
    </property>
    <property name="specialFeatures" type="string">
        <column name="special_features" length="54" />
    </property>
    <property name="lastUpdate" type="timestamp">
        <column name="last_update" length="19" not-null="true" />
    </property>
    <set name="filmActors" table="film_actor" inverse="true" lazy="true"     fetch="select">
        <key>
            <column name="film_id" not-null="true" />
        </key>
        <one-to-many class="sakila.entity.FilmActor" />
    </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">
 <!-- Generated 22-feb-2018 15:04:57 by Hibernate Tools 4.3.1 -->
 <hibernate-mapping>
<class name="sakila.entity.FilmActor" table="film_actor" catalog="sakila" optimistic-lock="version">
    <composite-id name="id" class="sakila.entity.FilmActorId">
        <key-property name="actorId" type="short">
            <column name="actor_id" />
        </key-property>
        <key-property name="filmId" type="short">
            <column name="film_id" />
        </key-property>
    </composite-id>
    <many-to-one name="actor" class="sakila.entity.Actor" update="false"      insert="false" fetch="select">
        <column name="actor_id" not-null="true" />
    </many-to-one>
    <many-to-one name="film" class="sakila.entity.Film" update="false" insert="false" fetch="select">
        <column name="film_id" not-null="true" />
    </many-to-one>
    <property name="lastUpdate" type="timestamp">
        <column name="last_update" length="19" not-null="true" />
    </property>
</class>
 </hibernate-mapping>

使用以下句子:从电影F中选择不同的F.title,电影演员X INNER加入X.actor内部加入X.film WHERE X.actor ='1',它显示了所有电影的列表,但不仅显示了具有actorId的演员的电影= 1怎么了?

尝试:

SELECT F.title, A.firstName FROM Film F
JOIN f.film_actors fa
JOIN fa.actor ac
WHERE ac.id = '1'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM