Как использовать «размер» в качестве имени поля в спящем объекте / jpa?
У меня есть два объекта 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 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 getFiles() {
return files;
}
//[...]
}
Здесь я хочу суммировать размер VirtualFiles, содержащихся в данном VirtualLot, используя репозиторий Spring Data JPA:VirtualLotRepository
, Запрос определяется следующим образом:
public interface VirtualLotRepository extends JpaRepository
{
@Query("select sum(f.size) from VirtualLot l join l.files f where l.id = ?1")
long sumFilesSize(long lotId);
}
Моя проблема в том, что Hibernate / JPA портит "размер" ключевое слово, оно интерпретирует его как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, что size является свойством size моего объекта 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);