用于JPQL查询结果的JPA Transformer

时间:2017-07-10 17:58:55

标签: hibernate jpa

在JPA 2.1中,我需要将JPQL查询的结果转换为自定义POJO对象。

我知道以下解决方案,但我无法使用它,因为我没有本机SQL查询。

@Entity
@Table("USER_T")
@SqlResultSetMapping(name="SearchResult", classes = {
        @ConstructorResult(targetClass = InternalUser.class, 
        columns = {@ColumnResult(name="userId"), @ColumnResult(name="firstName"),
                @ColumnResult(name="lastName"), @ColumnResult(name="role")
        })
    })

然后在我的DAO课程中,

javax.persistence.Query query = entityManager.createNativeQuery(jpql, "SearchResult");

如果我尝试这种方法,我会得到SQL异常,因为jpql变量不是本机SQL。它包含一个JPQL表达式,它允许一些“额外”,比如在Where子句或Order-By中指定自定义字段。

所以我需要createNativeQuery(strQuery, strMapping)而不是createQuery(strQuery, strMapping) - 而不是{...}}。有什么建议?我仍然需要将结果转换为自定义POJO。

1 个答案:

答案 0 :(得分:0)

根据JB Nizet的提示,JPQL自动转换语法是

private static final String SEARCH_JPQL = "select new  mydomain.InternalUser( " +
                       " users.id as userId,  " +
                       " abc.preferredFirstname as firstName,  " +
                       " abc.preferredLastname as lastName, " +
                       " users.role as role ) " +
    " from ... "

Select中的类名是接收结果集的POJO。 但必须有一个构造函数来支持它。所以我添加了

public InternalUser(String userId, String firstName, String lastName, String role) {
   this.userId = userId;
   this.firstName = firstName;
   this.lastName = lastName;
   this.role = role;
}