Java – how to use “size” as the field name in Hibernate / JPA entities?
I have two JPA entities: virtuallot and virtualfiles Virtualfiles extends virtualinode
VirtualFile. java
@Entity
@Table(name = "FIL_FILE")
public class VirtualFile extends VirtualInode {
//[...]
}
VirtualInode. java
@Entity
@Table(name = "INO_INODE")
@Inheritance(strategy = InheritanceType.JOINED)
public class VirtualInode implements Serializable {
private Long id; /* The PK */
private long size = 0L; /* The size */
// [...]
/**
* Default constructor
*/
public VirtualInode() {
super();
}
/**
* @return the id
*/
@Id
@Column(name = "INO_ID",nullable = false)
public Long getId() {
return id;
}
/**
* @return the size
*/
@Column(name = "INO_SIZE",nullable = false)
public long getSize() {
return size;
}
//[...]
}
VirtualLot. java
@Entity
@Table(name = "VLT_VIRTUAL_LOT")
public class VirtualLot implements Serializable {
private Long id; /* The PK */
private Collection<VirtualFile> files;
/**
* Default constructor
*/
public VirtualLot() {
super();
}
/**
* @return the id
*/
@Id
@Column(name = "VLT_ID",nullable = false)
public Long getId() {
return id;
}
/**
* @return the files
*/
@ManyToMany
@JoinTable(name = "R001_FIL_VLT",joinColumns = @JoinColumn(name = "VLT_ID",referencedColumnName = "VLT_ID"),inverseJoinColumns = @JoinColumn(name = "INO_ID",referencedColumnName = "INO_ID"))
public Collection<VirtualFile> getFiles() {
return files;
}
//[...]
}
Here, I want to use the spring data JPA repository to summarize the size of the virtual files contained in a given virtual lot: virtual lotrepository The query definition is as follows:
public interface VirtualLotRepository extends JpaRepository<VirtualLot,Long>
{
@Query("select sum(f.size) from VirtualLot l join l.files f where l.id = ?1")
long sumFilesSize(long lotId);
}
My problem is that hibernate / JPA confuses the "size" keyword, which is interpreted as the size function defined by hibernate( http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html/ch11.html#ql -collection-expressions)
The query result is:
select
sum((select
count(virtualfil2_.VLT_ID)
from
R001_FIL_VLT files1_,FIL_FILE virtualfil2_
inner join
INO_INODE virtualfil2_1_
on virtualfil2_.INO_ID=virtualfil2_1_.INO_ID
where
virtuallot0_.VLT_ID=files1_.VLT_ID
and files1_.INO_ID=virtualfil2_.INO_ID)) as col_0_0_
from
VLT_VIRTUAL_LOT virtuallot0_
inner join
R001_FIL_VLT files1_
on virtuallot0_.VLT_ID=files1_.VLT_ID
inner join
FIL_FILE virtualfil2_
on files1_.INO_ID=virtualfil2_.INO_ID
inner join
INO_INODE virtualfil2_1_
on virtualfil2_.INO_ID=virtualfil2_1_.INO_ID
where
virtuallot0_.VLT_ID=?
Which (obviously) doesn't work I hope it's like this:
select
sum(virtualfil2_1_.INO_SIZE)
from
VLT_VIRTUAL_LOT virtuallot0_
inner join
R001_FIL_VLT files1_
on virtuallot0_.VLT_ID=files1_.VLT_ID
inner join
FIL_FILE virtualfil2_
on files1_.INO_ID=virtualfil2_.INO_ID
inner join
INO_INODE virtualfil2_1_
on virtualfil2_.INO_ID=virtualfil2_1_.INO_ID
where
virtuallot0_.VLT_ID=?
Which applies to my SQL register (with the correct '?' value)
Is it possible to tell hibernate / JPA that size is the size attribute of my virtuarinode / virtualfile entity rather than the size function?
I've tried double quotation mark escape, but it doesn't work I use Oracle10g dialect
Edit: if I add a duplicate attribute fsize to my virtualinode entity and use it in my request, it can work, but this is not the solution I'm looking for
VirtualInode. java
@Column(name = "INO_SIZE",nullable = false,updatable = false,insertable = false)
public long getFsize() {
return getSize();
}
public void setFsize(final long size) {
setSize(size);
}
VirtualLotRepository. java
@Query("select sum(f.fsize) from VirtualLot l join l.files f where l.id = ?1")
long sumFilesSize(long lotId);
Solution
Size is a reserved keyword, such as default or for Java Therefore, either change the name of the variable in perhabs nodesize or specify a special name for the base column using @ column (name = "nodesize") annotation with the name attribute
