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

任何帮助,将不胜感激。

+2

请添加完整的错误信息(堆栈跟踪,编译器错误?) – GhostCat

+0

@GhostCat更新我的问题 – Hiru

+0

会'名单>'没事的返回类型,或你绝对要'名单> '? –

我不知道这是一个有效的解决方案或没有,但,我 从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(); 
+0

我需要在这里应用namedQuery。 – Hiru

+0

代码已更改。 – jklee

+0

是的。但我不需要改变任何泛型类。只有我删除resultClassType,它的工作。感谢你付出的努力。 – Hiru