当前位置: 首页 > 面试题库 >

如何在休眠/ jpa实体中使用“大小”作为字段名称?

蔚楷
2023-03-14
问题内容

我有两个JPA实体:VirtualLotVirtualFilesVirtualFiles延伸VirtualInode。两者之间存在ManyToMany关系,VirtualLot并被VirtualFiles描述为
“一个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;
    }
    //[...]
}

在这里,我要总结使用弹簧数据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”关键字,它将其解释为SIZEhibernate定义的函数(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,大小是我的VirtualInode / VirtualFile实体的大小属性,而不是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是Java
defaultforJava中的保留关键字。因此,要么在perhabs中更改变量的名称,要么对属性nodeSize使用@Column(name = "nodeSize")Annotation,name为基本列指定特殊名称。



 类似资料:
  • 问题内容: 我有(简化示例): 和一个具体的(简化示例): 现在我需要包括列的索引,和。 如果我添加到hibernate中,则会向继承自的每个Entity 添加一个索引。 我试过了,但是它不能用于索引。 有任何想法吗? 问题答案: 如果正在使用,则可以将类注释及其属性索引一起使用 请注意,如文档所述 仅当表生成有效时才使用它们。默认为无其他索引。 ,如上所示,接受列名列表作为逗号分隔的列表。 如果

  • 问题内容: 我为Hibernate / JPA配置问题感到困惑,该问题阻止了我的带有JPA注释的实体自动注册: 在我的实体课程中,我有: 在MySQL中,语言表如下所示: 我的persistence.xml看起来像: 编辑 :这是我获取EntityManager并保持的方式: 问题答案: 事实证明这很简单:直接在persistence.xml文件中列出这些类。armandino和MikelRasc

  • 我在SQL服务器数据库中有表用户,有近30列。我还为相应的数据库表创建了一个JPA实体。JPA实体如下所示: 现在我正在尝试创建一个本机查询,它只会从用户表中获取id和name。Repository类看起来像这样。 现在,当它被执行时,它会抛出一个异常,如下所示: 当我将地址列添加到我的查询时,这个异常会消失,但它会出现在另一个字段中。 所以,现在我想修改JPA实体,使这个字段成为可选的。我试过使

  • 问题内容: 在具有两种类型的实体(父级和子级)的场景中: 父母-@OneToMany Collection孩子; 默认设置是对子级集合进行延迟加载。这种模式对少数儿童非常有效,但是如果这个数字很大,这似乎是不可持续的。因此,在某些情况下,我认为孩子的数量会很大,因此我使用了分页的服务方法(例如“ getChildren(父父母,int偏移量,int计数)”)。 问题是:这是处理此类情况的最佳方法吗

  • 问题内容: 假设我有这个课: 现在在我的课堂上,我试图找出先前的值实例与将要保存(更新)到数据库的新值。我使用preupdate metdhod来做到这一点: 因此,假设我有一个名称和姓氏的对象实例: 这不是由侦听器接听的,这是可以的,因为我仅侦听更新。现在,如果我要像这样更新此实例: 因此,这会触发mylistener中的方法以及当我尝试执行以下操作时: 当我调试时,我已经获得了新近更新的实例,

  • 问题内容: 当我使用@Entity注释类并尝试解决依赖关系时,我可以在两个不同的包javax.persistence.Entity和org.hibernate.annotations.Entity中选择包。 javax包是JPA的实体注释,但是为什么会有休眠的实体注释,它与JPA的注释有区别?仅仅是允许定义更多属性的扩展吗? 问题答案: 具有一些尚未标准化的额外属性。仅当直接使用hibernate