如何使用“尺寸"作为 hibernate/jpa 实体中的字段名称? [英] How to use "size" as a field name in a hibernate/jpa entity?
问题描述
我有两个 JPA 实体:VirtualLot
和 VirtualFiles
.VirtualFiles
扩展了 VirtualInode
.VirtualLot
和 VirtualFiles
之间存在 ManyToMany 关系,描述为 A VirtualLot 可以包含 VirtualFiles" 和 A VirtualFile 可以与多个 VirtualLots"实体定义如下:
I have two JPA entities : VirtualLot
and VirtualFiles
. VirtualFiles
extends VirtualInode
.
There is a ManyToMany relation between VirtualLot
and VirtualFiles
described as "A VirtualLot can contain VirtualFiles" and "A VirtualFile can be associated with multiple VirtualLots"
The entities are defined as follows :
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
.查询定义如下:
Here I want to sum the size of the VirtualFiles contained in a given VirtualLot using a Spring Data JPA repository : VirtualLotRepository
. The query is defined as follow :
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)
My problem is that Hibernate/JPA messes with the "size" keyword, it interprets it as a SIZE
function defined by hibernate (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=?
这(显然)不起作用.我希望它是这样的:
which (obviously) doesn't work. I want it to be 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=?
哪个适用于我的 SQL 暂存器(带有正确的?"值).
Which works in my SQL scratchpad (with a proper '?' value).
是否可以告诉 Hibernate/JPA size 是我的 VirtualInode/VirtualFile 实体的 size 属性而不是 SIZE 函数?
我已经尝试过双引号转义,但不起作用.我使用的是 Oracle10g 方言.
I have already tried double-quotes escaping and that doesn't work. I use an Oracle10g dialect.
如果我将重复的属性 fsize
添加到我的 VirtualInode
实体并在我的请求中使用它,它可以工作,但这不是我正在寻找的解决方案.
EDIT :
If I add a duplicate property fsize
to my VirtualInode
entity and use it in my request, it works, but that 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);
推荐答案
size
是保留关键字,类似于 Java 中的 default
或 for
.因此,要么在 perhabs nodeSize
中更改变量的名称,要么使用带有 name
属性的 @Column(name = "nodeSize")
注释给一个基本列一个特殊的名字.
size
is a reserved keyword like default
or for
in Java. Therefore either change your name for your variable in perhabs nodeSize
or use the @Column(name = "nodeSize")
Annotation with the name
attribute to give a basic column a special name.
这篇关于如何使用“尺寸"作为 hibernate/jpa 实体中的字段名称?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!