我的JPA查询方法是否正确?

时间:2011-10-09 12:07:10

标签: java jpa

我在我的网络应用程序中使用JPA,当我不希望数据库返回所有对象时,我会执行以下操作:

    Query query = super.entityManager.createQuery("select b.id, b.buyName from Buy b where b.id in (:list)");
    query.setParameter("list", buyIds);

    List<Object[]> result = query.getResultList();
    List<Buy> retval = new ArrayList<Buy>();

    for (Object[] item : result) {
        Buy buy = new Buy();
        buy.setId((Long)item[0]);
        buy.setBuyName((String)item[1]);
        retval.add(buy);
    }

    return retval;

即,查询我想要的字段,然后手动创建所需对象的列表并填充它。 这是一个好习惯吗?感觉有更好的方法可以做到这一点。

谢谢。

4 个答案:

答案 0 :(得分:1)

我更喜欢criteria querynamed query

答案 1 :(得分:1)

也许,您应该创建一个单独的轻量级 POJO(仅包含必填字段),然后将结果映射到该POJO。

答案 2 :(得分:1)

可以直接从查询中返回一个新对象,只需要您需要的信息。例如,您的查询将如下所示:

select new BuyDTO(b.id, b.buyName) from Buy b where b.id in (:list) 

数据传输对象只包含所需的字段:

public class BuyDTO {

    private Long id;
    private String buyName;

    public BuyVO(Long id, String name) {
        this.id = id;
        this.buyName = name;
    }

    // getters and setters

}

运行查询时,它将返回List<BuyDTO>

答案 3 :(得分:0)

如果使用EclipseLink,您还可以在查询上设置FetchGroup以定义要返回的字段。

请参阅, http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroup