hibernate-HQL-内连接和迫切内连接(inner join/inner join fetch)

本人是大学在读菜鸟一个,最近做一个hibernate练习关于hibernate内连接的时候出现一个错误

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to domain.Article ...省略,发现是个人在写hql内连接语句的时候写fetch和不写fetch进行query.list()方法返回的内容不同导致的错误,特写出来跟大家分享,这是第一篇博客,如果有什么不足的地方请见谅,也请大家指出我代码或者讲解的不足之处,谢谢。
 

测试用的两个bean对象 Article和User(文章和作者) ,此处是多对一和一对多关系


@Entity
@Table(name = "t_article")
public class Article {
	private Integer article_id; // 文章id
	private String title; // 文章标题
	private String introduction; // 文章简介
	private String keyWord; // 文章关键字
	private String content; // 文章内容
	private Integer isPublish; // 是否发布(草稿)---0发布1草稿状态
	private Date createdDate; // 创建时间
	
	private User user;	//用户(作者)
	public Article(){
		this.setCreatedDate(new Date());
	}
    /*
        此处省略Article的大部分属性getter和setter操作以及hibernate的注解
    */
   
    @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.REMOVE})
	@JoinColumn(name="userId")
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
}
@Entity
@Table(name = "t_user")
public class User {
	private String userId; // 用户id
	private String account; // 用户帐号
	private String userName; // 用户名
	private String password; // 用户密码
	private String email; // 用户邮箱
	private String question; // 用户密保问题
	private String answer; // 用户密保答案
	
	private Set
articles =null; //文章 public User(){ articles = new HashSet
(); this.setUserId(UUID.randomUUID().toString().replaceAll("-","")); } /* 此处省略User的大部分属性getter和setter操作以及hibernate的注解 */ @OneToMany(cascade={CascadeType.ALL},mappedBy="user",fetch=FetchType.EAGER) public Set
getArticles() { return articles; } public void setArticles(Set
articles) { this.articles = articles; } }

接下来是内连接查询的主要代码,query.list()方法返回的是List,即把Article和User都返回,存放到list中,Object[0]是Artcile,Object[1]是User。

        List objs = null;
        Article article =null;
		User user = null;
        Query query = session.createQuery("from Article article inner join           article.user");    //这里的article.user,user就是前面Article中的Private User user
		objs = query.list();
		for(Object[] obj : objs){
			article = (Article) obj[0];
			user = (User) obj[1];
			System.out.println(article.getArticle_id()+"\t"+user.getUserId());
		}

最后是迫切内连接的主要代码,此时query.list()方法返回的List

,即把Article对象返回,而User存在Article中。

        List
objs = null; Query query = session.createQuery("from Article article inner join fetch article.user"); objs = query.list(); for(Article article : objs){ System.out.println(article.getArticle_id()+"\t"+article.getUser().getUserId()); }

最后运行结果都是   

你可能感兴趣的:(hibernate,HQL)