加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:13:11 所属栏目:Java 来源:网络整理
导读:我有两个JPA实体:VirtualLot和VirtualFiles. VirtualFiles扩展了VirtualInode. VirtualLot和VirtualFiles之间存在ManyToMany关系,描述为“VirtualLot可以包含VirtualFiles”和“VirtualFile可以与多个VirtualLots关联” 实体定义如下: VirtualFile.java @E
我有两个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函数?

我已经尝试过双引号转义,但这不起作用.
我使用的是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或for Java.因此,要么在perhabs nodeSize中更改变量的名称,要么使用带有name属性的@Column(name =“nodeSize”)Annotation为基本列指定一个特殊名称.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读