hibernate通过mysql进行两表外连接查询问题

sxlcom 2010-02-08 05:04:11
以下getBlog 方法中为何在
Query query = session.createQuery("from Blog blog left join Links links where blog.username=links.name and blog.username=:userId");
语句时报:org.hibernate.hql.ast.QuerySyntaxException: Path expected for join! [from blogs.Blog blog left join Links links where blog.username=links.name and blog.username=:userId]

请位这是为什么?先谢了!!!!!!

----------方法如下------------------
/**
* 使用外连接方式进行多表查询处理
*/
public Blog getBlog (String userId) throws HibernateException {
Session session = HibernateUtil.currentSession();
List alist = new ArrayList();
Blog blog = null;
Transaction tx = null;
try {
tx = session.beginTransaction();
Query query = session.createQuery("from Blog blog left join Links links where blog.username=links.name and blog.username=:userId");
query.setParameter("userId", userId);
alist=query.list();
if (!alist.isEmpty())
blog = (Blog) alist.get(0);

tx.commit();
} catch (HibernateException e) {
if (tx != null)
tx.rollback();
e.printStackTrace();
throw e;
}
session.close();
return blog;
}


--------------持久化类---
public class Blog {
private int id;
private String username;
private String password;
private String subject;
private String email;
private String image;
private int visitcount;
//应构造方法是用于取一个表中部份列而用的确
public Blog(String userName,String password) {
this.username = userName;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getVisitcount() {
return visitcount;
}
public void setVisitcount(int visitcount) {
this.visitcount = visitcount;
}
}
---持久化类---
public class Links {
private int id;
private String name;
private String url;
private int blogid;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBlogid() {
return blogid;
}
public void setBlogid(int blogid) {
this.blogid = blogid;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
------------XML配置如下----
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="blogs">

<class name="blogs.Blog"
table="blog"
discriminator-value="C">

<id name="id">
<generator class="increment"/>
</id>

<property name="username"/>
<property name="password"/>
<property name="subject"/>
<property name="email"/>
<property name="image"/>
<property name="visitcount"/>
</class>

<class name="blogs.Links"
table="links"
discriminator-value="C">

<id name="id">
<generator class="increment"/>
</id>

<property name="name"/>
<property name="url"/>
<property name="blogid"/>


</class>


</hibernate-mapping>
...全文
272 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxlcom 2010-02-09
  • 打赏
  • 举报
回复
如果我方法改为如下:为何总是在Query query = session.createQuery("select blog.username,links.url from Blog blog left join blog.Links links where blog.username=:userId");
行报错:
org.hibernate.QueryException: could not resolve property: Links of: blogs.Blog [select blog.username,links.url from blogs.Blog blog left join blog.Links links where blog.username=:userId]
at org.hibernate.persister.entity.AbstractPropertyMapping.throwPropertyException(AbstractPropertyMapping.java:43)

.
.
.
public List getBlog(String userId) throws HibernateException {
Session session = HibernateUtil.currentSession();
List alist = new ArrayList();
Transaction tx = null;
try {
tx = session.beginTransaction();
Query query = session.createQuery("select blog.username,links.url from Blog blog left join blog.Links links where blog.username=:userId");
query.setParameter("userId", userId);
Iterator it =query.list().iterator();
while(it.hasNext()){

Object[] row = (Object[])it.next();
String username = (String) row[0];
String url = (String) row[1];
System.out.println("username=="+username+"=url="+url);

}
tx.commit();
} catch (HibernateException e) {
if (tx != null)
tx.rollback();
e.printStackTrace();
throw e;
}
session.close();
return alist;
}
sxlcom 2010-02-09
  • 打赏
  • 举报
回复
如果本人只想获取Bolg类和Links类中各对应的一个映射列,也就是只反回两列,应该如何处理?

islandrabbit 2010-02-09
  • 打赏
  • 举报
回复
这是因为楼主的Bolg类和Links类没有对应的外键关系。这种情况下上面的hql可改为:

from Blog blog, Links links where blog.username=links.name and blog.username=:userId
sxlcom 2010-02-09
  • 打赏
  • 举报
回复
在hibernate中要使用left join必须声明关联映射,这里的关联是many-to-many,请问在以上代码中如可配置??????

67,514

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧