我想在两个表格 Expense(ID, NAME, CATEGORY) 和 类别(ID,名称)。 在我的类里面,我创建了一个字段“类别类别”及其 setter 和 getter 。 我是在网上看到一些东西后才做的。我必须在我的 Category.java 类中做哪些更改。现在,它看起来像,
public class Category{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int catId;
private String catName;
public Category() {
}
public int getCatId() {
return this.catId;
}
public void setCatId(int catId) {
this.catId = catId;
}
public String getCatName() {
return this.catName;
}
public void setCatName(String catName) {
this.catName = catName;
}
}
我不想用 xml 配置做映射。我认为,注释对像我这样的初学者很有用。
还有我的老 friend ! SQL 查询看起来像,
SELECT EXPENSES.EXPNS_ID、EXPENSES.CAT_ID、EXPENSES.NAME、CATEGORY.CAT_NAME FROM EXPENSES INNER JOIN CATEGORY ON EXPENSES.CAT_ID = CATEGORY.CAT_ID WHERE USER_NAME="+currentUserName
如何在Hibernate中使用inner join?
任何建议!
谢谢!
更新
感谢所有回答者, 我试过你所说的,它返回一个空列表。
为了测试,我设置了表中的“userName=Tamil”。 Hibernate 生成的查询如下所示,
选择 expens0_.expnsId as expnsId1_,expens0_.catId as catId1_,expens0_.category_catId as category7_1_,expens0_.userName as userName1_ from Expens0_ inner join Category catId1_ on expens0_.category_catId=category1_.catId where expens0_.userName= ?
作为初学者,我对 JPQL 有一些疑问,我想从 Category[catId, catName]
表中获取 catName
。 catId
也可以在 Expens[expnsId, catId, userName]
中使用。
通过在 Expens.java 类中添加以下行,它将如何为我提供 catName
以及 Expens
表中的其他变量。
@ManyToOne
private Category category
// getters, setters
我无法理解它。如果不理解这一点,我就无法继续前进,我必须在我的项目中提供更多映射。如果清楚这个映射,我可以放心地移动到其余部分。
我使用的查询是 pascal 的版本:Query query = hSession.createQuery("SELECT e FROM Expens e JOIN e.category c WHERE e.userName = :userName").setParameter("userName", userName) ;
对我来说,hibernate 生成的查询看起来和我的旧 SQL 查询一样。我在这里找不到问题。
最佳答案
实际上,对您的情况有用的文档的很大一部分位于 Hibernate 注释引用指南(下面提供的链接)中。阅读它会是非常值得的。
话虽如此,关于您的具体问题,最简单的映射可能是:
@Entity
public class Expense {
@Id @GeneratedValue
private Long;
@ManyToOne
private Category category
// getters, setters
...
}
就是这样。
如果你想让它成为双向的,你必须添加一个 OneToMany
另一方面(不要忘记 mappedBy
元素,因为关联是双向的):
@Entity
public class Category {
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy="category")
private Set<Expense> expenses = new HashSet<Expense>();
....
}
一个可能的 JPQL 查询是:
SELECT e FROM Expense e JOIN e.category c WHERE e.username = :username
更新:Hibernate 和JDBC 是不同的。使用 Hibernate,您需要考虑对象,上面的 HQL 查询(更多的是一个示例)实际上将返回 List<Expense>
。 .要获取类别名称,请迭代结果并浏览关联。例如:
List<Expense> expenses = ... // some code to retrieve a list by username
for (Expense expense : expenses) {
System.out.println(expense.getCategory().getName());
}
引用资料
关于java - 如何在 hibernate 中创建多对一映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3766880/