Java 内部联接在hibernate中不工作?

Java 内部联接在hibernate中不工作?,java,hibernate,join,Java,Hibernate,Join,我有一个电影和演员表之间的oneToMany关联和一个manytone反向关联。一个JOIN可以工作,但是当我在JOIN中有一个filter子句时,它就失败了。请查找上面有注释的相关代码部分 我读过这篇文章。但这没有帮助 以下是我的实体中的相关部分: @Entity public class Movie { ...... @OneToMany(mappedBy="movie",fetch=FetchType.EAGER,cascade=CascadeType.ALL)

我有一个电影和演员表之间的
oneToMany
关联和一个
manytone
反向关联。一个JOIN可以工作,但是当我在JOIN中有一个filter子句时,它就失败了。请查找上面有注释的相关代码部分

我读过这篇文章。但这没有帮助

以下是我的实体中的相关部分:

@Entity
public class Movie {
    ......
    @OneToMany(mappedBy="movie",fetch=FetchType.EAGER,cascade=CascadeType.ALL)
    private Set<Actor> actors=new HashSet<>();
    //getters and setters
}

@Entity
public class Actor {
    .....
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="ACTOR_MOVIE")
    //getters and setters
}
@实体
公映{
......
@OneToMany(mappedBy=“movie”,fetch=FetchType.EAGER,cascade=CascadeType.ALL)
私有集actors=newhashset();
//接球手和接球手
}
@实体
公共级演员{
.....
@manytone(fetch=FetchType.EAGER)
@JoinColumn(name=“ACTOR\u MOVIE”)
//接球手和接球手
}
这是我的HibernateTest类:

public class HibernateTest {

    public static void main(String[] args) {
       Movie movie1 = new Movie("Mr and Mrs.Smith", new Date(2005, 6, 5));
        Actor actor3=new Actor("Brad");
        actor3.setMovie(movie1);
        Actor actor4=new Actor("Joe"); 
        actor4.setMovie(movie1); 
        movie1.getActors().add(actor3);
        movie1.getActors().add(actor4);

        Movie movie = new Movie("Titanic", new Date(1997,12,19));
        Actor actor1=new Actor("Leo");
        Actor actor2=new Actor("Kate");
        actor1.setMovie(movie);
        actor2.setMovie(movie); 
        movie.getActors().add(actor1); 
        movie.getActors().add(actor2); 

        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        session.persist(movie);
        session.persist(movie1);

        session.getTransaction().commit();
        session.close();

        session = sessionFactory.openSession();
        session.beginTransaction();

        //The following query works
        //List<Object[]> actor_from_movies=session.createQuery("select m.name,act.name from Movie m INNER JOIN m.actors act").list();

        //This throws error        
        List<Object[]> actor_from_movies=session.createQuery("select m.name,act.name from Movie m INNER JOIN m.actors act"
                + "where act.name=:acname").setParameter("acname", "Brad").list();

       System.out.println("actor_from_movies "+ actor_from_movies);

       session.getTransaction().commit();
    session.close();
}
}
公共类HibernateTest{
公共静态void main(字符串[]args){
电影1=新电影(“史密斯夫妇”,新日期(2005年6月5日));
演员3=新演员(“布拉德”);
actor3.setMovie(电影1);
演员4=新演员(“乔”);
演员4.布景电影(电影1);
movie1.getActors().add(actor3);
movie1.getActors().add(actor4);
电影=新电影(“泰坦尼克号”,新日期(1997,12,19));
演员1=新演员(“Leo”);
演员2=新演员(“凯特”);
演员1.布景电影(电影);
actor2.setMovie(电影);
movie.getActors().add(actor1);
movie.getActors().add(actor2);
SessionFactory SessionFactory=新配置().configure().buildSessionFactory();
Session Session=sessionFactory.openSession();
session.beginTransaction();
坚持(电影);
会议.坚持(电影1);
session.getTransaction().commit();
session.close();
session=sessionFactory.openSession();
session.beginTransaction();
//以下查询工作正常
//List actor_from_movies=session.createQuery(“select m.name,act.name from Movie m internal JOIN m.actors act”).List();
//这会引发错误
列出演员\u from\u movies=session.createQuery(“从电影m内部选择m.name、act.name加入m.actors act”
+“其中act.name=:acname”).setParameter(“acname”,“Brad”).list();
System.out.println(“电影中的演员”+电影中的演员);
session.getTransaction().commit();
session.close();
}
}
错误消息:

Sep 30, 2014 11:08:42 AM org.hibernate.hql.internal.ast.ErrorCounter reportError
ERROR: line 1:92: unexpected token: act
Sep 30, 2014 11:08:42 AM org.hibernate.hql.internal.ast.ErrorCounter reportError
ERROR: line 1:92: unexpected token: act
line 1:92: unexpected token: act
    at org.hibernate.hql.internal.antlr.HqlBaseParser.fromJoin(HqlBaseParser.java:1727)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.fromClause(HqlBaseParser.java:1380)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1086)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:731)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:323)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.statement(HqlBaseParser.java:186)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:295)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:203)
    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:167)
    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:1800)
    at com.example.hibernate.HibernateTest.main(HibernateTest.java:142)

Exception in thread "main" org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: act near line 1, column 92 [select m.name,act.name from com.example.hibernate.dto.Movie m INNER JOIN m.actors actwhere act.name=:acname]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:91)
    at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:109)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:304)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:203)
    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:167)
    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:1800)
    at com.example.hibernate.HibernateTest.main(HibernateTest.java:142)
2014年9月30日11:08:42 AM org.hibernate.hql.internal.ast.ErrorCounter reportError
错误:第1行:92:意外标记:act
2014年9月30日上午11:08:42 org.hibernate.hql.internal.ast.ErrorCounter报告错误
错误:第1行:92:意外标记:act
第1:92行:意外标记:act
位于org.hibernate.hql.internal.antlr.HqlBaseParser.fromJoin(HqlBaseParser.java:1727)
位于org.hibernate.hql.internal.antlr.HqlBaseParser.fromClause(HqlBaseParser.java:1380)
位于org.hibernate.hql.internal.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1086)
位于org.hibernate.hql.internal.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:731)
位于org.hibernate.hql.internal.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:323)
位于org.hibernate.hql.internal.antlr.HqlBaseParser.statement(HqlBaseParser.java:186)
位于org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:295)
位于org.hibernate.hql.internal.ast.QueryTranslatorImpl.docomFile(QueryTranslatorImpl.java:203)
位于org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
在org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:126)
在org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:88)
位于org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167)
位于org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
位于org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
位于org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1800)
位于com.example.hibernate.HibernateTest.main(HibernateTest.java:142)
线程“main”org.hibernate.hql.internal.ast.QuerySyntaxException中的异常:意外标记:act靠近第1行第92列[从com.example.hibernate.dto.Movie m内部连接m.actors actwhere act.name=:acname中选择m.name,act.name]
位于org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:91)
位于org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:109)
位于org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:304)
位于org.hibernate.hql.internal.ast.QueryTranslatorImpl.docomFile(QueryTranslatorImpl.java:203)
位于org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
在org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:126)
在org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:88)
位于org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167)
位于org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
位于org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
位于org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1800)
位于com.example.hibernate.HibernateTest.main(HibernateTest.java:142)

在以下位置前添加空白:

" where act.name=:acname").

抢手货想知道你是如何从错误信息中发现的吗?@头脑风暴是的。如果您向消息的这一部分显示
internal JOIN m.actors actwhere act.name=:acname
您可以看到
act
where
是连接的。谢谢!请注意,是否可以在不使用联接的情况下执行此查询。i、 e
session.createQuery(“从电影m中选择m.name,act.name,m.actors在act.name中的“BRAD”位置扮演”).list()
。当然,这不起作用,但想知道如果不加入,是否可能?Thanks@brainsto