[hibernate-issues] [Hibernate-JIRA] Resolved: (HHH-4290) Projection of composite key causes invalid SQL

Strong Liu (JIRA) noreply at atlassian.com
Mon Apr 26 00:14:33 EDT 2010


     [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-4290?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Strong Liu resolved HHH-4290.
-----------------------------

         Assignee: Strong Liu
       Resolution: Duplicate
    Fix Version/s: 3.5.x

fixed by HHH-1088 in 3.5.0-Final

> Projection of composite key causes invalid SQL
> ----------------------------------------------
>
>                 Key: HHH-4290
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4290
>             Project: Hibernate Core
>          Issue Type: Bug
>          Components: annotations
>         Environment: Hibernate Annotations 3.4.0.GA
> Hibernate Commons Annotations 3.1.0.GA
> Hibernate 3.3.1.GA
>            Reporter: Dmitry Katsubo
>            Assignee: Strong Liu
>            Priority: Minor
>             Fix For: 3.5.x
>
>
> When using {{Projections.id()}} for the entity, which has a composite ID, the generated SQL is not valid. The expression {{select this_.conceptid as y0_this_.termid as y1_}} should be {{select this_.conceptid as y0_, this_.termid as y1_}} (comma is missed)
> 07 14:40:37 DEBUG [ConnectionManager] opening JDBC connection
> 07 14:40:37 DEBUG [SQL] 
>     select
>         this_.conceptid as y0_this_.termid as y1_,
>         this_.text as y1_ 
>     from
>         term this_ limit ?
> 07 14:40:37 DEBUG [AbstractBatcher] about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
> 07 14:40:37 DEBUG [JDBCExceptionReporter] could not execute query [select this_.conceptid as y0_this_.termid as y1_, this_.text as y1_ from term this_]
> com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.termid as y1_, this_.text as y1_ from term this_ limit 1000' at line 1
> Code:
> {quote}
> final Session session = sessionFactory.openSession();
> try {
> 	return session.createCriteria(TermImpl.class).setProjection(
> 			Projections.projectionList().add(Projections.id()).add(Projections.property("text")))
> 			.setMaxResults(1000).list();
> } finally {
> 	session.close();
> }
> {quote}
> Mapped entity:
> {quote}
> @Entity
> @Table(name = "term")
> public class TermImpl implements Term, Serializable {
> 	@Embeddable
> 	public static class TermId implements Serializable {
> 		private int id;
> 		private Concept concept;
> 		@Column(name = "termid")
> 		public int getId() {
> 			return id;
> 		}
> 		public void setId(int id) {
> 			this.id = id;
> 		}
> 		@ManyToOne(targetEntity = ConceptImpl.class)
> 		@JoinColumn(name = "conceptid")
> 		@Fetch(FetchMode.SELECT)
> 		public Concept getConcept() {
> 			return concept;
> 		}
> 		public void setConcept(Concept concept) {
> 			this.concept = concept;
> 		}
> 		@Override
> 		public boolean equals(Object obj) {
> 			if (obj instanceof TermId) {
> 				TermId termId = (TermId) obj;
> 				return id == termId.id && concept.equals(termId.concept);
> 			}
> 			return false;
> 		}
> 		@Override
> 		public int hashCode() {
> 			return id + concept.hashCode();
> 		}
> 		@Override
> 		public String toString() {
> 			final ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE);
> 			builder.append("concept", concept);
> 			builder.append("id", id);
> 			return builder.toString();
> 		}
> 	}
> 	private TermId id;
> 	private String text;
> 	@Id
> 	public TermId getId() {
> 		return id;
> 	}
> 	public void setId(TermId id) {
> 		this.id = id;
> 	}
> 	@Transient
> 	@Override
> 	public Concept getConcept() {
> 		return id.getConcept();
> 	}
> 	@Column(name = "text")
> 	@Override
> 	public String getText() {
> 		return text;
> 	}
> 	public void setText(String text) {
> 		this.text = text;
> 	}
> 	@Override
> 	public boolean equals(Object obj) {
> 		if (obj instanceof TermImpl) {
> 			final TermImpl term = (TermImpl) obj;
> 			return id.equals(term.id);
> 		}
> 		return false;
> 	}
> 	@Override
> 	public int hashCode() {
> 		return id.hashCode();
> 	}
> 	@Override
> 	public String toString() {
> 		final ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE);
> 		builder.append("id", id);
> 		builder.append("text", text);
> 		return builder.toString();
> 	}
> }
> {quote}
> Table structure:
> {quote}
> CREATE TABLE `term` (
>   `conceptid` int(11) NOT NULL,
>   `termid` int(10) unsigned NOT NULL,
>   `text` varchar(255) default NULL,
>   PRIMARY KEY  (`conceptid`,`termid`)
> );
> {quote}

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list