Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate(JPA)是否允许映射自定义列(即别名列)_Java_Hibernate_Jpa - Fatal编程技术网

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);