- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有具有 OneToMany 关系的大学和学生实体:
@Entity
public class College {
@Id
@GeneratedValue
private int collegeId;
private String collegeName;
@OneToMany
private Collection<Student> students = new ArrayList<Student>();
public int getCollegeId() {
return collegeId;
}
public void setCollegeId(int collegeId) {
this.collegeId = collegeId;
}
public String getCollegeName() {
return collegeName;
}
public void setCollegeName(String collegeName) {
this.collegeName = collegeName;
}
public Collection<Student> getStudents() {
return students;
}
public void setStudents(Collection<Student> students) {
this.students = students;
}
}
@Entity
public class Student {
@Id
@GeneratedValue
private int studentId;
private String studentName;
public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
}
学生表中有一个大学的外键。
如果我想获取特定大学的所有学生,那么在 native SQL 中我可以使用以下查询来实现:
Select * from student where collegeId=1
是否可以通过从学生实体而不是大学实体中进行选择来实现与 HQL 相同的效果。
我的实用程序类:
public class ManyToOne {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.hibernate.examples");
EntityManager em = emf.createEntityManager();
College college1 = new College();
college1.setCollegeName("College1");
College college2 = new College();
college2.setCollegeName("College2");
Student student1 = new Student();
student1.setStudentName("std1");
college1.getStudents().add(student1);
Student student2 = new Student();
student2.setStudentName("std2");
college2.getStudents().add(student2);
Student student3 = new Student();
student3.setStudentName("std3");
college1.getStudents().add(student3);
Student student4 = new Student();
student4.setStudentName("std4");
college1.getStudents().add(student4);
em.getTransaction().begin();
em.persist(college1);
em.persist(college2);
em.persist(student1);
em.persist(student2);
em.persist(student3);
em.persist(student4);
em.getTransaction().commit();
em.close();
em = emf.createEntityManager();
em.getTransaction().begin();
String queryString = "select students from "+ College.class.getName()+" where collegeId = 1";
Query query = em.createQuery(queryString);
List<Student> students = query.getResultList();
for(int i=0;i<students.size();i++)
System.out.println(students.get(i).getStudentName());
em.getTransaction().commit();
em.close();
emf.close();
}
}
异常堆栈跟踪:
Exception in thread "main" java.lang.IllegalStateException: No data type for node: org.hibernate.hql.internal.ast.tree.IdentNode
\-[IDENT] IdentNode: 'students' {originalText=students}
at org.hibernate.hql.internal.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:174)
at org.hibernate.hql.internal.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:924)
at org.hibernate.hql.internal.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:692)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:665)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:249)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:131)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:93)
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 org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:328)
at utils.ManyToOne.main(ManyToOne.java:66)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
最佳答案
尝试一下(刚刚在 your other question 中看到映射没问题)
String queryString = "select s from Student s where s.college.collegeId = 1";
编辑
关于您的评论,Hibernate 有一个“功能”,如果它找不到具有给定名称的字段,它只会将您提供的任何内容传递给 SQL。在你的情况下,这意味着
String queryString = "from Student where collegeId=1";
由于collegeId
不是Student
中的字段,因此它将按原样传递到SQL中,从而得到您想要的查询。当然,缺点是代码与底层数据库模型的耦合,绕过了 ORM 映射。
关于java - 在 ManyToOne 关系中触发 HQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27526625/
我只是没有明白这一点。下面的代码是怎么回事,哪里出错了?我必须上课:资源和预订。一个资源可以有多个预留,并且关系是双向的。对我来说,一切似乎都找到了,我已经查看了一堆资源和文档 - 是的,还有很多示例
我正在寻找有关大型遗留模式映射的一些建议。 情况是这样的。假设我们有一个名为 BusinessTransaction 的类。此类有几个引用用户 ID 的字段: @Entity public class
我正在寻找有关大型遗留模式映射的一些建议。 情况是这样的。假设我们有一个名为 BusinessTransaction 的类。此类有几个引用用户 ID 的字段: @Entity public class
我上课了: @Entity @Table(name="users") public class User{ private Integer id; private String name; priva
我有一个实体类 付款 其中有实体类 付款方式 与 多对一 关系。 现在因为我的 PaymentMethod 是主表。 所以我想在不影响主表 PaymentMethod 的情况下保存付款。 但是每次我保
关系的 @OneToMany 端填充良好,但 @ManyToOne 端每次都会覆盖(仅最后一项保留) @Entity @Table(name="order") public c
下面的联接保留了与每个客户端相关的 TaxJurisdictions,但它不包括插入中联接 (CLIENT_CODE) 中使用的列,导致我的数据库表 TBL_TAX_JURISDICTION.CLIE
我得到了城市和天气。天气应该指向数据库中的城市对象。一个城市可以有多个天气条目。我的问题是,每次我向数据库添加天气时,它都会创建一个具有相同名称但具有其他 ID 的新城市。 天气实体; @Entity
所以我的数据库中有一份文档有修订。文档表包含文档通用的元数据,修订版包含内容。目前我可以获得正确修订的文档。 我想做的是通过映射的所有修订获取文档列表。 这是我的两个实体: @Entity publi
大家好。 我有一个问题让我睡不着)例如,如果我有一个名为 Product 的实体(类)。我应该将这个产品与一堆图像链接起来。在数据库(在我的例子中是MySQL)中,我会创建一个产品表和图像表。图像表将
我使用 Spring Roo 对 MySQL 数据库进行逆向工程,这是一个我只有读取权限的数据库。 其中一个名为 Transaction 的实体有一个名为 originalTransaction 的字
我可以建立如下关系吗: @Entity Table1{ @ManyToOne @JoinColumn(name = "Column1", referen
我有以下单向 ManyToOne 关系: @Entity @Table(name = "Child") public class Child { @Id private Integer
我的关系非常简单,我的模型如下所示: public class Project { [PrimaryKey, AutoIncrement] public int ID { get; s
我有以下数据库结构: CREATE TABLE `author` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255
目录 jpa实体@ManyToOne @OneToMany无限递归 问题描述 解决办法 @OneToMany和@ManyTo
我在保存具有 ManyToOne 双向关系的实体时遇到问题,这里是: 警告:HHH000437:正在尝试保存一个或多个与未保存的 transient 实体具有不可空关联的实体。在保存这些依赖实体之前,
我有 2 个实体 - 具有映射 @ManyToOne 的用户和角色。我想更改用户角色,但角色也想更新。 用户实体: @ManyToOne @JoinColumn(name = "role_id", i
我有 4 个类如下... @MappedSuperclass @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) public abstrac
想象一下下面的类 @Embeddable class A { @ManyToOne public B classB; ... public State someEnum
我是一名优秀的程序员,十分优秀!