为什么JPQL只使用AS返回查询结果中的第一个和最后一个字段?

时间:2014-09-10 12:19:56

标签: eclipselink jpa-2.0 jpql

我有一个模特:

public class SomeModel extends Model {

      private String name;

      private String description;

      private String comment;

      ... a lot of other fields

      private String note;

}

我想从数据库中获取模型列表作为仅包含所需字段的地图列表。我按照以下方式做到了:

EntityManager em = GuiceConfigSingleton.inject(EntityManager.class); 

Query query = em.createQuery("SELECT 
o.name AS ModelName, 
o.description AS ModelDescription, 
o.comment AS ModelComment,
o.note AS ModelNote 
FROM SomeModel o");

query.setHint(QueryHints.RESULT_TYPE, ResultType.Map);

此查询的结果列表是地图列表。并且每个映射仅包含第一个(ModelName)和最后一个(ModelNote)字段(其他字段在数据库中不为空)。当我没有" as"只使用:

Query query = em.createQuery("SELECT 
o.name, 
o.description, 
o.comment,
o.note 
FROM SomeModel o");

我得到了所有的字段,但没有正确的密钥。怎么了?

屏幕截图简化示例:

使用" AS":http://imgur.com/bKZnqSx 没有" AS":http://imgur.com/PieCRzg

更新 这是EclipseLink 2.5.0中的一个错误。 2.5.2一切都还可以!

2 个答案:

答案 0 :(得分:0)

还有另一种获取这些字段的方法

Query query = entityManager.createNativeQuery("your existing query");

    final List<Object[]> rsList = (List<Object[]>) query.getResultList();
    for (Object[] objects : rsList) {

        String modelName = objects[0] == null ? ""
                : objects[0].toString();
        String modelDesc = objects[1] == null ? ""
                : objects[1].toString();
        String comment = objects[2] == null ? ""
                : objects[2].toString();

        String note = objects[3] == null ? ""
                : objects[3].toString();
    }

我希望它有所帮助。

答案 1 :(得分:0)

这是EclipseLink 2.5.0版本中的一个错误。从2.5.1开始一切正常!

获得的经验教训:始终检查最后一个版本