我在JpaRepository
中有一个方法,它应该返回一个JPA实体列表:
@Entity
public class SomeEntity {
// ...
}
@Repository
public interface SomeOtherEntityRepository extends JpaRepository<SomeOtherEntity, Long> {
@Query(value = "select some big long native query", nativeQuery = true)
public List<SomeEntity> getThings(String key);
}
执行此查询并尝试访问List
中的条目时,我得到ClassCastException
:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to my.package.SomeEntity
at java.util.ArrayList.forEach(ArrayList.java:1249)
at ...
这似乎破坏了Java中的强类型变量。我不知道这是可能的。我可以更改我的代码以期望一个Object数组并将Object数组转换为实体,但这似乎是我不应该做的事情。
答案 0 :(得分:0)
JPA似乎不支持为@Query
指定结果类。您可以使用@NamedNativeQuery
或EntityManager.createNativeQuery
来指定结果类。
答案 1 :(得分:0)
您键入的实体查找方法必须与存储库类型匹配。在这里,您声明您的存储库实体为SomeOtherEntity
,但您的查找方法getThings
正在返回({1}}的列表。
答案 2 :(得分:0)
您需要使用SqlResultSetMapping。一个好的教程是:http://www.thoughts-on-java.org/result-set-mapping-basics/
示例代码:
Query q = em.createNativeQuery(
"SELECT o.id AS order_id, " +
"o.quantity AS order_quantity, " +
"o.item AS order_item, " +
"i.name AS item_name, " +
"FROM Order o, Item i " +
"WHERE (order_quantity > 25) AND (order_item = i.id)",
"OrderResults");
@SqlResultSetMapping(name="OrderResults",
entities={
@EntityResult(entityClass=com.acme.Order.class, fields={
@FieldResult(name="id", column="order_id"),
@FieldResult(name="quantity", column="order_quantity"),
@FieldResult(name="item", column="order_item")})},
columns={
@ColumnResult(name="item_name")}
)