1

我正在尝试将一个简单的 Play/JPA 查询转换为使用标准 API。下面甚至不是我要转换的查询;这个简单——只是想从一开始就取得成功。

我在网上找到的所有示例都希望您能够使用在类名后面附加了 _ 的类,就像我看到的休眠查询对生成的 SQL 中的表名别名所做的那样。但是,我无法让我的代码以这种方式编译,因为没有类:ExtendedHaulTrain_(但是有 ExtendedHaulTrain)

我需要向 ExtendedHaulTrain 类添加某种注释吗?也许我没有深入阅读,但到目前为止我发现的示例并没有解决附加下划线的类的问题。

这是我在最后一行编译失败的代码,特别是在 ExtendedHaulTrain_

Query query = JPA.em().createQuery("select DISTINCT(x.trnType) from ExtendedHaulTrain x");
List<String> trainTypes = query.getResultList();

//as criteria query
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<ExtendedHaulTrain> q = cb.createQuery(ExtendedHaulTrain.class);
Root<ExtendedHaulTrain> xhtRoot = q.from(ExtendedHaulTrain.class);
q.select(xhtRoot.get(ExtendedHaulTrain_.trnType)).distinct(true);
4

3 回答 3

1

除了 MetaModel 类(它们以 '_' 结尾),您始终可以使用字符串形式的属性名称作为参考。

q.select(xhtRoot.get("trynType")).distinct(true);
于 2013-11-08T16:24:44.273 回答
0

正如我在评论中指出的那样,我宁愿避免使用元模型类的概念。下面是我如何将现有查询转换为使用条件 API。同样,这只是为了获得成功;我可能不会替换查询。相反,我有另一个更复杂的查询,我打算使用 Criteria API;这只是为了熟悉 Criteria API —— 可能会有更多问题要跟进!

/*
Query query = JPA.em().createQuery("select DISTINCT(x.trnType) from ExtendedHaulTrain x");
List<String> trainTypes = query.getResultList();
*/

CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(ExtendedHaulTrain.class);
Root root = cq.from(ExtendedHaulTrain.class);
cq.select(root.get("trnType")).distinct(true);
List<String> trainTypes = JPA.em().createQuery(cq).getResultList();
于 2013-11-08T16:13:34.290 回答
0

我知道您不喜欢这些元模型,但这实际上是一件非常有用的事情,它可以使您的代码保持类型安全的安全(相信我,一旦您开始编写更多查询,您就会看到优势) . 优点是:您可以使用所谓的元模型生成器(它们是注释处理工具)自动生成它们。例如,Hibernate 有一个生成器。在 Eclipse 中很容易生成它们。在 Maven 中也很容易。我建议使用它们。


更新

类型安全实际上意味着您不必编写xhtRoot.get("trynType")也可以使用正确的连接类型。不要忘记,与 NamedQueries 相比,CriteriaQueries 不会在部署时检查。这意味着,如果您在连接结果的通用部分中删除或使用了错误的类型(下面的 WrongOwner)

Join<WrongOwner, Address> address = cq.join(Pet_.owners).join(Owner_.addresses);

你会在编译时知道这一点。

于 2013-11-08T22:40:39.970 回答