2013-07-31 21 views
1

我有一個查詢,我只想檢索具有一個或多個Link子項的消息對象。MySQLSyntaxErrorException在使用查詢中的子項計數時由Hibernate生成的MySQLSyntaxErrorException

我的郵件類是:

package zzz.community.domain; 

/** 
* Entity implementation class for Entity: Message. 
*/ 
@Entity 
@Table(name = "MESSAGE") 
public class Message implements Serializable { 

private static final long serialVersionUID = 2252587276028343749L; 

public static final int MAX_LENGTH_TITLE = 255; 

public static final int MAX_LENGTH_TEXT = 200000; 

@Id @GeneratedValue 
private Long id; 

private String title; 

@Column(columnDefinition = "TEXT") 
private String text; 

/** 
* The date at which the message was posted. 
*/ 
private Date creationDate; 

/** 
* The profile id of the user that posted this message. 
*/ 
@OneToOne 
private Profile creator; 

/** 
* The id of the circle the message was posted to. 
*/ 
@OneToOne 
private Circle circle; 

/** 
* When true, only members of the circle may see this message. 
*/ 
private Boolean membersOnly; 

@OneToMany(mappedBy="message") 
@OrderBy("id DESC") 
private Set<Link> links; 

public Long getId() { 
    return id; 
} 

public void setId(final Long id) { 
    this.id = id; 
} 

public String getText() { 
    return text; 
} 

public void setText(final String text) { 
    this.text = text; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(final String title) { 
    this.title = title; 
} 

public Date getCreationDate() { 
    return creationDate; 
} 

public void setCreationDate(final Date creationDate) { 
    this.creationDate = creationDate; 
} 

public Profile getCreator() { 
    return creator; 
} 

public void setCreator(final Profile creator) { 
    this.creator = creator; 
} 

public Circle getCircle() { 
    return circle; 
} 

public void setCircle(final Circle circle) { 
    this.circle = circle; 
} 

public Boolean getMembersOnly() { 
    return membersOnly; 
} 

public void setMembersOnly(final Boolean membersOnly) { 
    this.membersOnly = membersOnly; 
} 

public Set<Link> getLinks() { 
    return this.links; 
} 

public void setLinks(final Set<Link> links) { 
    this.links = links; 
} 

public void addLink(final Link link) { 
    this.links.add(link); 
} 

} 

JPA查詢我寫的是:

select m from Message m 
where m.circle = :circle 
and count(m.links) > 0 
order by m.creationDate DESC 

休眠正確地解析這個代碼(無AST除外),但所產生的MySQL的說法是不正確的,並拋出MySQLSyntaxErrorException

 
09:01:22.153 [http-apr-8080-exec-3] DEBUG org.hibernate.hql.ast.ErrorCounter - throwQueryException() : no errors 
09:01:22.154 [http-apr-8080-exec-3] DEBUG o.h.hql.ast.QueryTranslatorImpl - HQL: select m from zzz.domain.Message m where m.circle = :circle and count(m.links) > 0 order by m.creationDate DESC 
09:01:22.154 [http-apr-8080-exec-3] DEBUG o.h.hql.ast.QueryTranslatorImpl - SQL: select message0_.id as id3_, message0_.circle_id as circle6_3_, message0_.creationDate as creation2_3_, message0_.creator_id as creator7_3_, message0_.membersOnly as membersO3_3_, message0_.text as text3_, message0_.title as title3_ from MESSAGE message0_ cross join LINK links1_ where message0_.id=links1_.message_id and message0_.circle_id=? and count(.)>0 order by message0_.creationDate DESC 

同樣,由此產生的MySQL查詢:

select 
    message0_.id as id3_ 
, message0_.circle_id as circle6_3_ 
, message0_.creationDate as creation2_3_ 
, message0_.creator_id as creator7_3_ 
, message0_.membersOnly as membersO3_3_ 
, message0_.text as text3_ 
, message0_.title as title3_ 
from MESSAGE message0_ 
cross join LINK links1_ 
where message0_.id=links1_.message_id 
and message0_.circle_id=? 
and count(.)>0 
order by message0_.creationDate DESC 

解決方法,當然,是去除選擇標準

count(m.links) > 0 

和在Java一些代碼替換它。但我希望能對你們中的一個人提出更好的建議。
由於提前,

亨克

+0

告訴我們您的郵件類。 – Elbek

回答

1

在JPQL此例如可以做具有以下結構之一:

  • 空集合比較表達式IS [NOT] EMPTY
  • SIZE功能

隨着第一個以下:

count(m.links) > 0 

被替換爲:

m.links IS NOT EMPTY 

而第二種方法是:

SIZE(m.links) > 0 
+0

作品!謝謝! –

相關問題