UnionSubclassEntityPersister.generateSubquery() does not use column.getQuotedName()

Description

Hi all,

I'm new to hibernate and I'm trying to use the Inheritance strategy TABLE_PER_CLASS with a Postgres database.
The postgres database contains tables and column with upper cases names (names must be quoted).
In the entity I used the back-quote ` sign to quote the table names and column names.
All basic requests work but when I have an association going to the virtual parent table then I got an error due to the fact that the Union subclass entity persister does not quote the column names inside the sub query.

I've locate the problem and I think it occurs here:
org.hibernate.persister.entity.UnionSubclassEntityPersister.java (svn rev. 11398)
line 395 ------------------------------------------------------------------------------------------------ while ( citer.hasNext() ) {
Column col = (Column) citer.next();
if ( !table.containsColumn(col) ) {
int sqlType = col.getSqlTypeCode(mapping);
buf.append( dialect.getSelectClauseNullString(sqlType) )
.append(" as ");
}
buf.append( col.getName() );
buf.append(", ");
But should be ------------------------------------------------------------------------------------------------ buf.append( col.getQuotedName() );

Here is an example to test:

Item.java:
--------------------------------- @Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item implements java.io.Serializable {
private long id;
private Container parent;
/** getter / setter */

@Id
@Column(name = "`ID`", unique = true, nullable = false, insertable = true, updatable = true)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "item_id_seq_generator")
@SequenceGenerator(name="item_id_seq_generator", sequenceName="item_id_seq", allocationSize=1)
public long getId() {
return this.id;
}

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

@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
@JoinColumn(name = "`ParentID`", unique = false, nullable = true, insertable = true, updatable = true)
public Container getParent() {
return this.parent;
}

public void setParent(Container parent) {
this.parent = parent;
}
}

Container.java
--------------------------------- @Entity
@Table(name = "`CoNTaiNeR`")
public class Container extends Item {
private Set<Item> items = new HashSet<Item>(0);

@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, mappedBy = "parent", targetEntity = Item.class)
public Set<Item> getItems() {
return this.items;
}

public void setItems(Set<Item> items) {
this.items = items;
}
}

SimpleItem.java
--------------------------------- @Entity
@Table(name = "`SimpleItem`")
public class SimpleItem extends Item {
/.../
}

So when you try to get the Container.getItems() then it generates the wrong query.

Cheers,
/Benoit

Activity

Show:

Christian DemoustierSeptember 10, 2009 at 10:40 AM

Column.getQuotedName() "returns quoted name as it would be in the mapping file" as from the source file. Therefore an " ` " appears in the generated SQL which is not a valid quote for PostGreSQL or other databases.

It works best if you use :

buf.append( col.getQuotedName(dialect) );

which uses the dialect provided quote character.

Fixed

Details

Assignee

Reporter

Components

Fix versions

Affects versions

Priority

Created December 4, 2007 at 10:59 AM
Updated May 4, 2022 at 6:43 PM
Resolved May 4, 2022 at 6:43 PM