Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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/2/spring/11.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 SpringJPA在使用自定义查询时抛出ClassCastException_Java_Spring_Jpa_Spring Data Jpa - Fatal编程技术网

Java SpringJPA在使用自定义查询时抛出ClassCastException

Java SpringJPA在使用自定义查询时抛出ClassCastException,java,spring,jpa,spring-data-jpa,Java,Spring,Jpa,Spring Data Jpa,我试图从查询中只获取一组特定的列,然而,我得到的是ClassCastException 2019-03-16 00:03:19.321 ERROR 8440 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request process

我试图从查询中只获取一组特定的列,然而,我得到的是ClassCastException

2019-03-16 00:03:19.321 ERROR 8440 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.metadata.entity.FileItem] with root cause

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.metadata.entity.FileItem
    at com.metadata.service.FileItemService.findFileWithVersion(FileItemService.java:39) ~[classes/:na]
    at com.metadata.service.FileItemService$$FastClassBySpringCGLIB$$7a805cbb.invoke(<generated>) ~[classes/:na]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]
FileItemId.java

import lombok.Data;
import java.io.Serializable;
import java.util.UUID;

@Data
public class FileItemId implements Serializable {
    private UUID id;
    private Long version;
}
FileItemRepository

import com.metadata.entity.FileItem;
import com.metadata.entity.FileItemId;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import java.util.List;
import java.util.UUID;

public interface FileItemRepository extends JpaRepository<FileItem, UUID> {
    @Query("select f.id, f.version, f.name, f.totalSize, f.createdAt " +
            "from FileItem f " +
            "where f.id = ?1 and f.version = ?2")
    List<FileItem> findByFileIdAndVersion(UUID id, Long version);

}
导入com.metadata.entity.FileItem;
导入com.metadata.entity.FileItemId;
导入org.springframework.data.jpa.repository.JpaRepository;
导入org.springframework.data.jpa.repository.Modifying;
导入org.springframework.data.jpa.repository.Query;
导入java.util.List;
导入java.util.UUID;
公共接口FileItemRepository扩展了JpaRepository{
@查询(“选择f.id、f.version、f.name、f.totalSize、f.createdAt”+
“来自文件项f”+
“其中f.id=?1和f.version=?2”)
列出FindByFileId和版本(UUID id,长版本);
}

我很久没有使用JPA了,但您的查询似乎返回了一个数组对象[]

那么您的方法的签名应该是:

@Query("select f.id, f.version, f.name, f.totalSize, f.createdAt " +
            "from FileItem f " +
            "where f.id = ?1 and f.version = ?2")
    Object[] findByFileIdAndVersion(UUID id, Long version);
否则,如果要保留方法签名:

@Query("select f " +
            "from FileItem f " +
            "where f.id = ?1 and f.version = ?2")
    List<FileItem> findByFileIdAndVersion(UUID id, Long version);

其中MyDTO是一个定制的javabean,您可以根据自己的需要编写它。

我通过在spring中使用找到了一个解决方案。然而,我不确定这是否是最好的解决办法

FileItemNoBlob

import java.util.Date;
import java.util.UUID;

public interface FileItemNoBlob {
    UUID getId();
    Long getVersion();
    Date getCreatedAt();
    Long getTotalSize();
    String getName();
}

FileItemNoBlob findByIdAndVersion(UUID id,长版本)似乎正在工作。最好为投影类创建另一个存储库,使其更干净。

Hi Nico。谢谢你的帮助。我试图只获取一些列,所以我猜第二个将返回所有列。不过我会尝试第三种解决方案
@Query("select new com.mycompany.mypackage.MyDTO(f.id, f.version, f.name, f.totalSize, f.createdAt) " +
            "from FileItem f " +
            "where f.id = ?1 and f.version = ?2")
    MyDTO findByFileIdAndVersion(UUID id, Long version);
import java.util.Date;
import java.util.UUID;

public interface FileItemNoBlob {
    UUID getId();
    Long getVersion();
    Date getCreatedAt();
    Long getTotalSize();
    String getName();
}