java – 如何在hibernate / jpa实体中使用“size”作为字段名?
我有两个JPA实体:VirtualLot和VirtualFiles. VirtualFiles扩展了VirtualInode.
VirtualLot和VirtualFiles之间存在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<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; } //[...] } 在这里,我想使用Spring Data JPA存储库来汇总给定VirtualLot中包含的VirtualFiles的大小:VirtualLotRepository.查询定义如下: 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); } 我的问题是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函数? 我已经尝试过双引号转义,但这不起作用. 编辑: 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或for Java.因此,要么在perhabs nodeSize中更改变量的名称,要么使用带有name属性的@Column(name =“nodeSize”)Annotation为基本列指定一个特殊名称.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |