Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jpa标准表别名_Java_Jpa_Openjpa_Criteria Api - Fatal编程技术网

Java Jpa标准表别名

Java Jpa标准表别名,java,jpa,openjpa,criteria-api,Java,Jpa,Openjpa,Criteria Api,您好,我正在努力使用criteria api编写以下查询: 从货物c、货币c中选择c.id、货币名称 问题在于,根据条件,货物和货币都被别名为c,因此生成的jpql变成“从货物c中选择c.id,c.name,货币c” 我不知道这是否是因为这两个实体都以C开头。 有没有办法更改表别名 CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder(); CriteriaQuery<Tuple> query=

您好,我正在努力使用criteria api编写以下查询: 从货物c、货币c中选择c.id、货币名称

问题在于,根据条件,货物和货币都被别名为c,因此生成的jpql变成“从货物c中选择c.id,c.name,货币c”

我不知道这是否是因为这两个实体都以C开头。 有没有办法更改表别名

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Tuple> query= criteriaBuilder.createTupleQuery();

Root<Cargo> cargo= query.from(Cargo.class);
Root<Currency> currency= query.from(Currency.class);
CriteriaBuilder-CriteriaBuilder=getEntityManager().getCriteriaBuilder();
CriteriaQuery=criteriaBuilder.createTupleQuery();
根cargo=query.from(cargo.class);
Root currency=query.from(currency.class);

非常感谢您的帮助。

您的代码缺少指定所选内容的部分。从货物c、货币c中选择c.id、货币名称 可能会转化为:

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Tuple> query= criteriaBuilder.createTupleQuery();

Root<Cargo> cargo= query.from(Cargo.class);
Root<Currency> currency= query.from(Currency.class);

query.multiselect(cargo.get("id"), currency.get("name"));
Query query = em.createQuery(cq);
List<Tuple> results = query.getResultList();
CriteriaBuilder-CriteriaBuilder=getEntityManager().getCriteriaBuilder();
CriteriaQuery=criteriaBuilder.createTupleQuery();
根cargo=query.from(cargo.class);
Root currency=query.from(currency.class);
query.multiselect(cargo.get(“id”)、currency.get(“name”);
Query Query=em.createQuery(cq);
List results=query.getResultList();
这里有一个仅使用一个表的示例:

经过大量调试后,我发现实际执行的jpql与ide(eclipse)中显示的jpql不同。 别名还可以。我想我被ide欺骗了一点。
谢谢大家的关注。

从Cargo c JOIN Currency curr中选择c.id、curr.name
?检查两个实体的映射规范,并检查它们是否映射到同一个表上。它们映射到不同的表。两个实体的表名不同。实体名不应影响api标准,因为它通常不会被翻译成JPQL(尽管您没有提到提供者)。你得到的SQL是什么,你想得到什么样的结果?“SELECT c.id,curr.name FROM Cargo c,Currency curr”返回了两个表的笛卡尔积,似乎并没有那么有用,这真的是您的应用程序所追求的吗?我使用的是openjpa 2.2.2。这是我在我的原始帖子中得到的SQL:“从货物c中选择c.id,c.name,货币c”。关键是,这两个实体的别名为“c”。当我使用一个实体时,没有问题。两个或多个以不同字母开头的实体没有问题。但是当它们以我的帖子中的相同字母开头时,则oops!。可能别名是从实体名称的首字母中选择的。可能。您是否尝试按照建议修复查询,并得到相同的结果?JPQL查询发生了什么?是的,我做了。得到了相同的结果。我可以确认表别名是从实体名称的第一个字母中选择的。