JPA以通用方式命名查询getResultList()
问题描述:
我想从JPA以List<ProjectLevel<?>>
等通用方式命名查询的结果列表。我需要这个,因为我想以后再流。JPA以通用方式命名查询getResultList()
ProjectLevel
是一个泛型类。
public abstract class ProjectLevel<T extends ProjectLevel>{
....
}
如建议的那样添加ProjectLevel的子类。
@Entity
@Getter
@Setter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@Table(uniqueConstraints = {
@UniqueConstraint(columnNames = {"businessAccountId", "id"})})
@NamedQueries({
@NamedQuery(name = "Project.findByProjectIdOrUUID",
query = "SELECT p FROM Project p WHERE (p.id = :id OR p.uuid = :id) and p.businessAccountId = :businessAccountId")
})
public class Project extends ProjectLevel {
private static final long serialVersionUID = 2167149510293504460L;
@Nonnull
private String customerUUID;
@Nonnull
@Enumerated(EnumType.STRING)
private Currency currency;
@Nonnull
@Enumerated(EnumType.STRING)
private ProjectType projectType;
@Nonnull
@Enumerated(EnumType.STRING)
private ContractType contractType;
@Nonnull
private String cityLocation;
private boolean locationPermission;
private boolean insuranceRequired;
}
我试过,但它给了我类型转换错误,如
不兼容的类型:
List<ProjectLevel>
不能从getResultList转换为List<ProjectLevel<?>>
()线
public List<ProjectLevel<?>> findUUIDByNameorNumber(@Nonnull final String nameOrId,
@Nonnull final String businessAccountId) {
checkNotNull(nameOrId, "The nameOrId must not be null");
return (List<ProjectLevel<?>>)getEntityManager()
.createNamedQuery("ProjectLevel.findUUIDByNameOrId", ProjectLevel.class)
.setParameter("name", matchesFromBeginning(nameOrId))
.setParameter("businessAccountId", businessAccountId)
.getResultList();
}
任何帮助,将不胜感激。
答
我不知道这是一个有效的解决方案或没有,但,我 从createNamedQuery去除resultClass参数解决这个问题。
resultClass - 查询结果
同样的类型,它会抛出IllegalArgumentException
如果不匹配的类型。 从DOC:
- 如果查询尚未与 定名称或定义,如果查询字符串被发现是无效的,或者如果 查询结果发现没有可分配给指定的类型
所以,我改变了我的方法。现在它工作正常。
@Nonnull
public List<ProjectLevel<?>> findUUIDByNameorNumber(@Nonnull final String nameOrId,
@Nonnull final String businessAccountId) {
checkNotNull(nameOrId, "The nameOrId must not be null");
return getEntityManager()
.createNamedQuery("ProjectLevel.findUUIDByNameOrId")
.setParameter("name", matchesFromBeginning(nameOrId))
.setParameter("businessAccountId", businessAccountId)
.getResultList();
}
答
泛型类可能如下所示。
@Entity(name="ProjectLevel")
@Inheritance(strategy = InheritanceType.JOINED)
@NamedQuery(name="ProjectLevel.findAll", query="SELECT p FROM ProjectLevel p")
public class ProjectLevel<T> implements Serializable {
...
}
@Entity
public class ProjectLevelString extends ProjectLevel<String>{
String projectLevel;
}
@Entity
public class ProjectLevelInteger extends ProjectLevel<Integer>{
Integer projectLevel;
}
您可以选择所有ProjectLevel与
List<ProjectLevel<?>> resultList = entityManager.createNamedQuery("ProjectLevel.findAll").getResultList();
请添加完整的错误信息(堆栈跟踪,编译器错误?) – GhostCat
@GhostCat更新我的问题 – Hiru
会'名单>'没事的返回类型,或你绝对要'名单> '? –