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

对于两个类/表之间的连接,正确的Hibernate查询语法是什么?

姬国安
2023-03-14

我已经做了几个小时没有成功。对于我从这里记录的其他事件或其他地方的示例中尝试的所有内容,HQL语法在我的方法中似乎总是错误的:

 Session session = sessionFactory.openSession();
    try { 


        Query query = session.createQuery("select p from Person p join p.books where p.personId = :personId").setParameter("personId", personId);

        List<Person> persons = query.list();    
        Person person = persons.get(0);
        Hibernate.initialize(person.getBooks());
        return person;
    }        
    finally {
        session.close();            
    }    

每次Hibernate都会给我一条信息:

@Entity
@Table(name = "PERSON")
public class Person implements Serializable {

// Attributes.    
@Id
@Column(name="PERSON_ID", unique=true, nullable=false)    
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer personId;

@Column(name="NAME", nullable=false, length=50)      
private String name;

@Column(name="ADDRESS", nullable=false, length=100)
private String address;

@Column(name="TELEPHONE", nullable=false, length=10)
private String telephone;

@Column(name="EMAIL", nullable=false, length=50)
private String email;

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)     
private List<Book> books;
Entity
@Table(name = "BOOK")
public class Book implements Serializable {

// Attributes.
@Id
@Column(name="BOOK_ID", unique=true, nullable=false)
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer bookId;

@Column(name="AUTHOR", nullable=false, length=50)
private String author;

@Column(name="TITLE", nullable=false, length=50)
private String title;

@Column(name="DESCRIPTION", nullable=false, length=500)
private String description;

@Column(name="ONLOAN", nullable=false, length=5)
private String onLoan;

@ManyToOne
@JoinColumn(name="person_Id")    
private Person person;
select person0_.PERSON_ID as PERSON_I1_1_0_, book2_.BOOK_ID as BOOK_ID1_0_1_, person0_.ADDRESS as ADDRESS2_1_0_, person0_.EMAIL as EMAIL3_1_0_, person0_.NAME as NAME4_1_0_, person0_.TELEPHONE as TELEPHON5_1_0_, book2_.AUTHOR as AUTHOR2_0_1_, book2_.DESCRIPTION as DESCRIPT3_0_1_, book2_.ONLOAN as ONLOAN4_0_1_, book2_.person_Id as person_I6_0_1_, book2_.TITLE as TITLE5_0_1_, books1_.PERSON_PERSON_ID as PERSON_P1_1_0__, books1_.books_BOOK_ID as books_BO2_2_0__ from PERSON person0_ left outer join PERSON_BOOK books1_ on person0_.PERSON_ID=books1_.PERSON_PERSON_ID left outer join BOOK book2_ on books1_.books_BOOK_ID=book2_.BOOK_ID where person0_.PERSON_ID=?

使用如下所示的查询:

Query query = session.createQuery("select from Person as p left join fetch p.books where p.personId = :personId").setParameter("personId", personId);

堆栈跟踪为:

Your page request has caused a QuerySyntaxException: unexpected token: from near line 1, column 8 [select from library.model.Person as p left join fetch p.books where p.personId = :personId] error:
 org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:91)

共有1个答案

景岳
2023-03-14

使用联接提取急切地加载链接的集合:

FROM Person as p LEFT JOIN FETCH p.books WHERE p.personId = :personId
 类似资料:
  • 大家好,我在使用jparepository使用@query连接两个表时遇到了一个小问题,但我得到了错误。请帮我做这个。

  • 问题内容: 我有两个我以为是同一意思的查询,但是我一直得到不同的结果,我希望有人可以解释这些差异如何: 1。 2。 查询的重点是查找表1中的行和val = 0而不是表2中的行。 我也使用sql server 2008,但是我怀疑这是否重要。 问题答案: 在考虑左联接时,应将它们视为具有3个概念阶段。 应用联接过滤器 左侧的行又被添加回 应用where子句。 然后,您将看到为什么得到不同结果的原因。

  • 我有两个域对象,如下所示 使用者Java语言 产品Java语言 在这种情况下,用户到产品具有多对一关系。多个用户可以订阅同一产品。我想通过连接这两个表来查询User表中的用户电子邮件ID,其中productId是产品表中的主键,foriegn键是User表中的foriegn键...如何使用Hibernate查询语言或标准通过连接这两个表来做到这一点?

  • 我需要连接来自两个不同表的数据,如下所示。仅使用一个sql查询就可以做到这一点吗?如果“key”和“name”在两个表上,那么它们是相同的。表1中的“状态”始终为“-”,表2中的“T”。此外,两个表上的“名称”和“comp”都匹配(例如:Name3-C和Name4-B)<我尝试过“联合”和“加入”,但还没有解决办法! 表1 表2 结果应该是。。。 提前谢谢!

  • 我有两个表与1:1的关系,我使用内容提供者和CursorLoader。 如何使连接查询与游标加载器一起工作?我可以用内容提供程序中的rawSql来黑它,但如何在游标加载器构造函数中做就不是我能做到的了。 多谢!

  • 有一个实体, 查询以下4种场景的正确REST-ful方式是什么: 所有员工名单 具有给定ID的员工 具有给定ID和姓名的员工 具有给定ID、姓名和电话号码的员工 两个起跑点非常直截了当: 然而,现在我们想要根据多个属性筛选实体,我能想到的最佳解决方案是: 有没有更好的方法来做到这一点?有些人提出了如下解决方案: 然而,我觉得以上这些违背了宁静的表达方式。