具有_附加到className的JPA条件实体的类不存在

时间:2013-11-08 15:50:46

标签: java jpa playframework-2.0 criteria-api

我正在尝试将简单的Play / JPA查询转换为使用条件API。下面甚至不是我想要转换的查询;这个甚至更简单 - 只是试图让某些东西成功开始。

我在网上找到的所有例子都希望你能够使用一个附加到类名的_的类,就像我看到hibernate查询对生成的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);

3 个答案:

答案 0 :(得分:1)

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

q.select(xhtRoot.get("trynType")).distinct(true);

答案 1 :(得分: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();

答案 2 :(得分:0)

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


更新

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

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

你会在编译时知道。