我想在两个表格之间创建多个映射,费用(ID,NAME,CATEGORY)和 类别(ID,NAME)。 在我的课堂上,我创建了一个字段'Category category'及其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配置进行映射。我认为,注释对像我这样的初学者来说是好事。
我老了! 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中使用内连接?
任何建议!!
谢谢!
更新
感谢所有的回答者, 我尝试了你说的,它返回一个空列表。
要测试我设置表中的'userName = Tamil'。 Hibernate生成的查询如下所示,
select expens0_.expnsId as expnsId1_, expens0_.catId as catId1_, expens0_.category_catId as category7_1_, expens0_.userName as userName1_ from Expens expens0_ inner join Category category1_ on expens0_.category_catId=category1_.catId where expens0_.userName=?
作为初学者,我对JPQL有一些疑问,我希望来自catName
表的Category[catId, catName]
。 catId
也可以在Expens[expnsId, catId, userName]
中使用catName
。
通过在Expens.java类中添加以下行,它将如何为Expens
提供@ManyToOne
private Category category
// getters, setters
表中的其他变量。
Query query = hSession.createQuery("SELECT e FROM Expens e JOIN e.category c WHERE e.userName = :userName").setParameter("userName", userName);
我无法理解它。如果不理解这一点我无法继续前进,我必须在我的项目中提供更多的映射。如果使用此映射清除,我可以放心地移动到其余部分。
我使用的查询是pascal的版本:{{1}}
对我来说,hibernate生成的查询与我的旧SQl查询看起来相同。我在这里找不到问题。
答案 0 :(得分:4)
实际上,在您的案例中有用的文档的很大一部分位于Hibernate Annotations Reference Guides(下面提供的链接)中。阅读它将非常值得。
话虽如此,关于您的具体问题,最简单的映射可能是:
@Entity
public class Expense {
@Id @GeneratedValue
private Long;
@ManyToOne
private Category category
// getters, setters
...
}
这就是全部。
如果你想使它成为双向的,你必须在另一边添加OneToMany
(并且不要忘记mappedBy
元素,因为关联是双向的):< / p>
@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());
}
答案 1 :(得分:2)
在Expense
班级中有:
@ManyToOne
@JoinColumn(name="CATEGORY_ID")
private Category category
正如评论中所指出的,如果您需要访问给定类别中的所有费用,即具有一对多关系,您可以:
@OneToMany
private List<Expense> expenses;
例如,我喜欢使用尽可能少的@OneToMany
映射 - 你必须管理急切/延迟加载,在某些时候限制结果的数量等。对于他们我倾向于使用用于获取我需要的对象子集(在您的情况下为费用)的HQL查询。
答案 2 :(得分:2)
正如Bozho所说,
@ManyToOne(fetch=FetchType.EAGER) // Gonna be eager by default anyway
@JoinColumn(name="CATEGORY_ID")
private Category category;
在你的Category类中加上它以使其成双向,
@OneToMany(mappedBy="category")
private List<Expense> expense;
你不需要做那样的内部联接。查询费用时,相关类别将自动加载,最有可能使用加入。