Java Hibernate(JPA)是否允许映射自定义列(即别名列)
我有一个简单的实体,它的属性很少,如图所示。 查询如下Java Hibernate(JPA)是否允许映射自定义列(即别名列),java,hibernate,jpa,Java,Hibernate,Jpa,我有一个简单的实体,它的属性很少,如图所示。 查询如下 select *,concat(current_date - cre_dte::date) as _days_ago from test."general" where (current_date - cre_dte::date)=7 or (current_date - cre_dte::date)<11 我正在尝试将实体映射到存储\u天前,从本机查询映射到pojo。为此,我修改了pojo,添加了@For
select *,concat(current_date - cre_dte::date) as _days_ago
from test."general"
where (current_date - cre_dte::date)=7 or (current_date - cre_dte::date)<11
我正在尝试将实体映射到存储\u天前
,从本机查询映射到pojo。为此,我修改了pojo,添加了@Formula。但似乎没有将此别名映射到我的属性。在我的JPA界面中,我的方法如下
@Query(nativeQuery = true,value = "select *, concat(current_date - cre_dte::date) as _days_ago from general where (current_date - cre_dte::date)=7 or (current_date - cre_dte::date)<11")
public List<GeneralEntity> getFewDaysAgo() throws Exception;
@Query(nativeQuery=true,value=“select*,concat(current_date-cre_dte::date)作为一般日期之前的日期,其中(current_date-cre_dte::date)=7或(current_date-cre_dte::date)您可以为此使用@公式
:
public class GeneralEntity implements Serializable {
...
@Formula("current_date - cre_dte::date")
Integer daysAgo;
}
但我通常不建议这样做,因为每次获取GeneralEntity实体时都会执行这样的操作
通常情况下,最好使用此用例的自定义DTO投影来处理此问题。您可以使用以下内容:
class GeneralEntityDto {
Long id;
String loadNumber;
Date createdDate;
String daysAgo;
// constructor + getters
}
还有这样一个查询:
@Query("select new com.mycompany.package.GeneralEntityDto(g.id, g.loadNumber, g.createdDate, concat(current_date - cast(g.createdDate as date)) from GeneralEntity where (current_date - cast(g.createdDate as date))=7 or (current_date - cast(g.createdDate as date))<11")
public List<GeneralEntityDto> getFewDaysAgo();
查询是将实体视图应用于查询的问题,最简单的就是按id进行查询
GeneralEntityDto a=entityViewManager.find(entityManager,GeneralEntityDto.class,id);
Spring数据集成允许您像使用Spring数据投影一样使用它:
public默认列表getFewDaysAgo(){
返回findAll((根、查询、准则生成器)->{
表达式e=criteriaBuilder.function(“DAY_DIFF”,root.get(createdDate).as(java.sql.Date.class),criteriaBuilder.currentDate());
返回标准生成器(
criteriaBuilder.equal(e,criteriaBuilder.literal(7)),
criteriaBuilder.lessThan(e,criteriaBuilder.literal(1))
);
});
}
公共清单findAll(规范s);
感谢Christian,通过添加基于构造函数的方法,它对我很有效。
@Query("select new com.mycompany.package.GeneralEntityDto(g.id, g.loadNumber, g.createdDate, concat(current_date - cast(g.createdDate as date)) from GeneralEntity where (current_date - cast(g.createdDate as date))=7 or (current_date - cast(g.createdDate as date))<11")
public List<GeneralEntityDto> getFewDaysAgo();
@EntityView(GeneralEntity.class)
public interface GeneralEntityDto {
@IdMapping
Long getId();
String getLoadNumber();
Date getCreatedDate();
@Mapping("DAY_DIFF(CAST_DATE(createdDate), current_date)")
String getDaysAgo();
}
public default List<GeneralEntityDto> getFewDaysAgo() {
return findAll((root, query, criteriaBuilder) -> {
Expression e = criteriaBuilder.function("DAY_DIFF", root.get(createdDate).as(java.sql.Date.class), criteriaBuilder.currentDate());
return criteriaBuilder.or(
criteriaBuilder.equal(e, criteriaBuilder.literal(7)),
criteriaBuilder.lessThan(e, criteriaBuilder.literal(1))
);
});
}
public List<GeneralEntityDto> findAll(Specification s);