PlayFramework从模型选择中获取字段

时间:2011-11-24 18:46:07

标签: java jpa playframework

由于关于模型的游戏文档很糟糕,我会问这里。我有基本代码;

public static void Controller() {
        List<Item> item = Item.find("SELECT itemname,id FROM Item WHERE itembool = true ORDER BY itemcreated ASC LIMIT 0,1").fetch();

        if ( item == null ) {
            notFound();
        }
    }

我要做的是获取从SQL查询返回的第一个值返回的'itemname'的值(真正的查询要复杂得多,其他的东西也不能用方法替换)。我可以使用item.get(0)获取整个第一个对象,但我无法弄清楚如何将'itemname'的值作为字符串获取,并且它似乎没有在任何地方记录。

修改

可能应该在原始问题中提到过,我需要按字段名称检索,而不是索引。 I.E.我做不到items.get(0)[0];我需要做items.get(0)['itemname'];

3 个答案:

答案 0 :(得分:5)

如果您阅读文档in here,则说明这一点。 Hibernate不使用SQL,而是使用JPQL,它具有与对象不同的语法,而不是单个字段。

您想要做的事情可以通过两种方式实现(均在文档中):

List<Item> item = Item.find("SELECT i FROM Item i WHERE i.itembool = true ORDER BY i.itemcreated ASC").fetch(1);

List<Item> item = Item.find("itembool = true ORDER BY itemcreated ASC").fetch(1);

修改

在检索部分,您将获得一个Item列表,因此您可以直接访问该对象上的字段:

item.get(0).getItemName();

答案 1 :(得分:3)

由于Play使用了Hibernate,因此您需要查看Hibernate's documentation

特别是,SELECT itemname,id ...会产生Object[]而不是Item,因此您可以按以下方式获取itemname

List<Object[]> items = ...;
String itemname = items.get(0)[0];

答案 2 :(得分:0)

如果你必须做select itemname,id ...,你将无法做items.get(0)["itemname"],因为正如axtavt和Pere所提到的那样,你会得到一个Object []。您可以创建另一个(可能是不可变的)实体类,可以在此查询中使用。有关详细信息,请参阅hibernate documentation。然后,您可以根据查询要求对实体进行建模,并使用它来获取信息,从而让hibernate为您处理所有神奇数字游戏。这样,你就会得到一个带有填充值的bean,你可以用它来映射回你的模型类。

HTH!