Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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 如何从Spring数据JPA NativeQuery接收集合?[导致NotReadablePropertyException]_Java_Spring_Spring Data Jpa - Fatal编程技术网

Java 如何从Spring数据JPA NativeQuery接收集合?[导致NotReadablePropertyException]

Java 如何从Spring数据JPA NativeQuery接收集合?[导致NotReadablePropertyException],java,spring,spring-data-jpa,Java,Spring,Spring Data Jpa,首先:我在Java8中使用Spring引导数据JPA 我的数据库中有一个表,其中实体的定义如下: @Entity @Table(name="ITEMHOURS") public class ItemHoursEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID") private int id; @Column(name = "YEAR",

首先:我在Java8中使用
Spring引导数据JPA

我的数据库中有一个表,其中实体的定义如下:

@Entity
@Table(name="ITEMHOURS")
public class ItemHoursEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private int id;

    @Column(name = "YEAR", nullable = false)
    private String year;

    @Enumerated(EnumType.STRING)
    @Column(name = "STATE", nullable = false)
    private TypeEnum type;

    @Column(name = "HOURVALUE", nullable = false)
    private int hourValue = 0;

    @ManyToOne(cascade = CascadeType.MERGE)
    @JoinColumn(name = "ITEM_ID")
    private MyItem item;
//.. some more columns, getters, setters...
}
现在,我得到了以下返回此结构的选择:

-----------------------
| YEAR | Value | Type |
-----------------------

@Query(value = "Select year as year, sum(hourvalue) as value, state as type from ITEMHOURS h where item_id = :item_id group by h.year, h.state", nativeQuery = true)
    public Optional<Collection<TotalValuesProjection>> getYearTotalsForStateByItem(@Param("item_id") int item_id);
现在,在我的
服务
-课程中,我尝试以下操作:

@Projection(types = { ItemHoursEntity.class })
public interface TotalValuesProjection {
    public String getYear();
    public int getValue();
    public HourTypeEnum getType();
}
@Override
public List<ExtendedDataPasser<String, Integer, String>> getTotalAndYearHourValuesForItem(int itemId) {

    Optional<Collection<TotalValuesProjection>> projectionOptional = this.hoursRepository.getYearTotalsForStateByItem(itemId);
    List<ExtendedDataPasser<String, Integer, String>> entityList = new ArrayList<ExtendedDataPasser<String, Integer, String>>();
    projectionOptional.orElseGet(() -> new ArrayList<TotalValuesProjection>()).forEach(entity -> {
        entityList.add(new ExtendedDataPasser<String, Integer, String>(entity.getYear(), entity.getValue(), entity.getType().toString()));
    });
    return entityList;
}
可能错误的完整屏幕截图有助于:

当我尝试首先访问
year
-属性时,这是一个例外。这是一个错误:(基本相同,只是
year
而不是
hourValue


我把从投影到实体的映射搞砸了吗?

这不是一个固溶体,只是一个大胆的想法。这主要取决于DBMS和Hibernate版本,但在某些情况下,由于大小写的不同,可能会出现这种异常,因此请尝试在本机查询中为别名添加引号,并在列名中为表别名添加引号,如下所示:

@Query(value = "Select h.year as \"year\", sum(h.hourValue) as \"value\", h.state as \"type\" from ITEMHOURS h where h.item_id = :item_id group by h.year, h.state", nativeQuery = true)
    public Optional<Collection<TotalValuesProjection>> getYearTotalsForStateByItem(@Param("item_id") int item_id);
@Query(value=“选择h.year为\“year\”,sum(h.hourValue)为\“value\”,h.state为\“type\”,其中h.item\u id=:item\u id按h.year分组,h.state“,nativeQuery=true)
公共可选getYearTotalsForStateByItem(@Param(“item_id”)int item_id);
UPD根据Java约定更改
hourValue
属性-“h”必须为大写

请尝试以下代码

@Query(value = "Select year, sum(hourvalue) as value, state as type from ITEMHOURS h where item_id = :item_id group by h.year, h.state", nativeQuery = true)
    public Optional<Collection<TotalValuesProjection>> getYearTotalsForStateByItem(@Param("item_id") int item_id);
@Query(value=“选择年份,总和(hourvalue)作为值,状态作为ITEMHOURS h中的类型,其中item_id=:item_id按h.year分组,h.state”,nativeQuery=true)
公共可选getYearTotalsForStateByItem(@Param(“item_id”)int item_id);

如果有任何问题,请通知

您是否打印了
集合中的值?看起来您在存储库中的映射不正确。您可能正在接收一个集合。它认为它区分大小写。。因此,您需要在查询列名时更改大小写。使其与DB或实体相同。或者将
sum(hourvalue)作为value
更改为
sum(hourvalue)作为hourvalue
当您在查询中将hourvalue数据定义为数据时,无法映射它。这是一个好主意,但遗憾的是没有成功:(-我认为在访问时有问题,当我尝试首先访问属性
value
时,然后是错误(如上所述)是为该属性而不是yearis抛出的吗?我是否遗漏了什么?:t尝试此空检查,entityList.add(新扩展的DataPasser(entity!=null?entity.getYear():“”,entity!=null?entity.getValue():0,entity!=null?entity.getType().toString():“”);并运行maven clean Build感谢您的建议,但这并没有改变结果:(您是指我的实体中的属性?或者我应该在哪里更改hourValue?
@Query(value = "Select year, sum(hourvalue) as value, state as type from ITEMHOURS h where item_id = :item_id group by h.year, h.state", nativeQuery = true)
    public Optional<Collection<TotalValuesProjection>> getYearTotalsForStateByItem(@Param("item_id") int item_id);