我有两个JPA实体:VirtualLot
和VirtualFiles
。VirtualFiles
延伸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”关键字,它将其解释为SIZE
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=?
(显然)不起作用。我希望是这样的:
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
default
或for
Java中的保留关键字。因此,要么在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