2016-12-30 122 views
2

我想從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

會'名單>'沒事的返回類型,或你絕對要'名單> '? –

回答

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

泛型類可能如下所示。

@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