如何使用“尺寸”作为hibernate / jpa实体中的字段名称? [英] How to use "size" as a field name in a hibernate/jpa entity?

查看:129
本文介绍了如何使用“尺寸”作为hibernate / jpa实体中的字段名称?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个JPA实体: VirtualLot VirtualFiles VirtualFiles 扩展 VirtualInode
VirtualLot VirtualFiles 之间有一个ManyToMany关系,这个关系被描述为一个VirtualLot可以包含VirtualFiles 一个VirtualFile可以与多个VirtualLots关联
实体定义如下: code> VirtualFile.java


$ b

  @Entity 
@Table(name =FIL_FILE)
public class VirtualFile extends VirtualInode {
// [...]
}

VirtualInode.java

  @Entity 
@Table(name =INO_INODE)
@Inheritance(strategy = InheritanceType.JOINED)
public class VirtualInode实现Serializable {
私人长ID; / * PK * /
私人长尺码= 0L; / *大小* /
// [...]

/ **
*默认构造函数
* /
public VirtualInode(){
super();
}

/ **
* @return the id
* /
@Id
@Column(name =INO_ID, nullable = false)
public Long getId(){
return id;

$ b / **
* @返回大小
* /
@Column(name =INO_SIZE,nullable = false)
public long getSize(){
return size;
}

// [...]
}

VirtualLot.java

  @Entity 
@Table(name =VLT_VIRTUAL_LOT)
public class VirtualLot实现Serializable {
private Long id; / * PK * /
私人收藏< VirtualFile>文件;
$ b $ **
*默认构造函数
* /
public VirtualLot(){
super();
}

/ **
* @return the id
* /
@Id
@Column(name =VLT_ID, nullable = false)
public Long getId(){
return id;
}


/ **
* @返回文件
* /
@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(){
返回文件;
}
// [...]
}

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

public interface VirtualLotRepository扩展了JpaRepository< VirtualLot,Long>
{
@Query(从VirtualLot中选择sum(f.size)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-表达式



结果查询为:


$ b

  select 
sum((从
中选择
count(virtualfil2_.VLT_ID)
R001_FIL_VLT files1_,
FIL_FILE virtualfil2_
内部连接
INO_INODE virtualfil2_1_
on virtualfil2_.INO_ID = virtualfil2_1_.INO_ID
where
virtuallot0_.VLT_ID = files1_.VLT_ID
和files1_.INO_ID = virtualfil2_.INO_ID))as col_0_0_

VLT_VIRTUAL_L OT virtuallot0_
内连接
R001_FIL_VLT文件1_
在virtuallot0_.VLT_ID = files1_.VLT_ID
内连接
FIL_FILE virtualfil2_
在files1_.INO_ID = virtualfil2_.INO_ID
内连接
INO_INODE virtualfil2_1_
在virtualfil2_.INO_ID = virtualfil2_1_.INO_ID
其中
virtuallot0_.VLT_ID =?

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

select
sum(virtualfil2_1_ .INO_SIZE)
from
VLT_VIRTUAL_LOT virtuallot0_
内连接
R001_FIL_VLT文件1_
上virtuallot0_.VLT_ID = files1_.VLT_ID
内连接
FIL_FILE virtualfil2_
on files1_.INO_ID = virtualfil2_.INO_ID
内连接
INO_INODE virtualfil2_1_
on virtualfil2_.INO_ID = virtualfil2_1_.INO_ID
其中
virtuallot0_.VLT_ID =?

这可以在我的SQL暂存器中使用(具有适当的'?'值)。 b
$ b

是否可以告诉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
$ b

  @Query(从VirtualLot中选择sum(f.fsize)l join l.files f其中l.id =?1)
long sumFilesSize(long lotId);


解决方案

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

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;
    }
    //[...]
}

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

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)

The resulted query was :

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

Which works in my SQL scratchpad (with a proper '?' value).

Is it possible to tell Hibernate/JPA that size is the size property of my VirtualInode/VirtualFile entity and not the SIZE function ?

I have already tried double-quotes escaping and that doesn't work. I use an Oracle10g dialect.

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 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆