如何在hibernate / jpa实体中使用“size”作为字段名?

我有两个JPA实体: VirtualLotVirtualFilesVirtualFiles扩展了VirtualInodeVirtualLotVirtualFiles之间存在ManyToMany关系,描述为“VirtualLot可以包含VirtualFiles”“VirtualFile可以与多个VirtualLots关联”实体定义如下:

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 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 getFiles() { return files; } //[...] } 

在这里,我想使用Spring Data JPA存储库来VirtualLotRepository给定VirtualLot中包含的VirtualFiles的大小: VirtualLotRepository 。 查询定义如下:

 public interface VirtualLotRepository extends JpaRepository { @Query("select sum(f.size) from VirtualLot l join l.files f where l.id = ?1") long sumFilesSize(long lotId); } 

我的问题是Hibernate / JPA混淆了“size”关键字,它将它解释为由hibernate定义的SIZE函数( http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html/ ch11.html #ql-collection-expressions )

结果查询是:

  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=? 

哪(显然)不起作用。 我希望它是这样的:

  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=? 

哪个适用于我的SQL暂存器(具有正确的’?’值)。

是否有可能告诉Hibernate / JPA size是我的VirtualInode / VirtualFile实体的size属性而不是SIZE函数?

我已经尝试过双引号转义,但这不起作用。 我使用的是Oracle10g方言。

编辑:如果我将重复属性fsize添加到我的VirtualInode实体并在我的请求中使用它,它可以工作,但这不是我正在寻找的解决方案。

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); 

size是保留关键字,如default或Java中。 因此,要么在perhabs nodeSize更改变量的名称,要么使用带有name属性的@Column(name = "nodeSize") Annotation为基本列指定一个特殊名称。

我不确定这个解决方案,但试一试:

只需使用以下内容更改您的@Query

 @Query(value = "select sum(f.size) from VirtualLot l join l.files f where l.id = ?1", nativeQuery = true) 

nativeQuery参数应该将您的查询更改为Oracle本机查询。

请参阅此stackoverflow主题以及此处提供的链接作为参考。

希望这能解决你的问题。