CriteriaBuilder并使用别名来选择原因

时间:2012-04-27 16:51:51

标签: jpa eclipselink jpql criteria-api

我想用CriteriaBuilder为这种sql创建一个查询;

SELECT myDefinedAlias.id, myDefinedAlias.name, myDefinedAlias.aFieldForFK select from Person as myDefinedAlias where myDefinedAlias.name = ?1

如何为此定义别名?

我可以创建没有别名的查询,但我无法定义别名......

CriteriaQuery<Person> cq = criteriBuilder.createQuery(Person.class);
Root<Person> person = cq.from(Person.class);
cq = cq.select(person);
cq = cq.where(criteriaBuilder.equal(person.get(Person_.name), "Chivas")))

我需要这个用于QueryHints,批量提取。

.setHint(QueryHints.BATCH, "myDefinedAlias.aFieldForFK.itsNestedAttribute"); 

我被困住了,无法找到有关我的问题的任何内容。任何人吗?

此致

2 个答案:

答案 0 :(得分:1)

执行cq.select(person).alias("myDefinedAlias")分配您的别名,该别名随后可用于批处理/获取查询提示。只要您不转移到多个关系(集合),Eclipselink就支持嵌套的提取连接。 I.e。.setHint(QueryHints.BATCH, myDefinedAlias.toOneRelation.toManyRelation")有效,而.setHint(QueryHints.BATCH, .setHint(QueryHints.BATCH, "myDefinedAlias.toManyRelation.toOneRelation")则不行。

答案 1 :(得分:0)

我认为你这是错误的做法。 JPA需要在生成sql语句时使用自身的sql-statement-aliases。 要使嵌套查询提示起作用,需要在实体中指定关系。 例如,如果您的Person实体具有到House实体的OneToMany映射 - 并且Person类中的属性名称是livingInHouses。查询提示将变为: .setHint(QueryHints.BATCH,“Person.livedInHouses”)。它几乎不可能使用存在于数据库中的FK,但没有注释为JPA中实体上的关系。