我需要一个通用的Criterion强制结果零匹配.
有点像Restrictions.eq(true, false)?
我已经读过,自版本6.9以来,Netbeans包含注释处理支持,例如,需要一个功能来生成JPA 2.0实体的元模型.
但是,我找不到任何能够准确显示如何操作的示例或文档.你们有没有成功的人?
我想这样做但是使用标准API代替:
select count(distinct e) from Event e, IN(e.userAccessPermissions) p where p.principal = :principal and p.permission in (:permissions)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我第一次使用Criteria API.它是关于抽象通用构建器的查询:
public TypedQuery<T> newQuery( Manager<?,T> manager )
{
CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
Class<T> genericClass = ( Class<T> ) ( ( ParameterizedType ) manager.getClass().getGenericSuperclass() ).getActualTypeArguments()[1];
CriteriaQuery<T> criteriaQuery = builder.createQuery( genericClass );
Root<T> root = criteriaQuery.from( genericClass );
...
}
Run Code Online (Sandbox Code Playgroud)
该调用默认为实体上找到的所有关系criteriaQuery.from( genericClass );生成SQL INNER JOIN.这是一个问题,因为每个关系都为空(DB NULL或不使用外键且具有无效引用的DB)这些实体将在结果列表中丢失,从而有效地产生错误的搜索结果.
可以在此处找到一个示例:JPA Criteria query Path.get left join is it possibile
对于由此类/方法实例化的查询,我想要发生的是实体上的所有关系,这里genericClass映射为optional = true
@ManyToOne( FetchType.EAGER, optional = true )
@JoinColumn( name = "CLOSE_USER_ID", referencedColumnName = "USER_ID" )
private …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现以下便捷方法:
/**
* Counts the number of results of a search.
* @param criteria The criteria for the query.
* @return The number of results of the query.
*/
public int findCountByCriteria(CriteriaQuery<?> criteria);
Run Code Online (Sandbox Code Playgroud)
在Hibernate中,这是通过
criteria.setProjection(Projections.rowCount());
Run Code Online (Sandbox Code Playgroud)
JPA中的上述内容是什么?我找到了许多简单的计数示例,但没有一个使用了应该确定行数的CriteriaQuery.
编辑:
不幸的是我发现@Pascal的答案不正确.问题非常微妙,只有在使用连接时才显示:
// Same query, but readable:
// SELECT *
// FROM Brain b
// WHERE b.iq = 170
CriteriaQuery<Person> query = cb.createQuery(Person.class);
Root<Person> root = query.from(Person.class);
Join<Object, Object> brainJoin = root.join("brain");
Predicate iqPredicate = cb.equal(brainJoin.<Integer>get("iq"), 170);
query.select(root).where(iqPredicate);
Run Code Online (Sandbox Code Playgroud)
在调用时findCountByCriteria(query),它会因以下异常而死亡:
org.hibernate.hql.ast.QuerySyntaxException: Invalid path: …Run Code Online (Sandbox Code Playgroud) 我有多个通过JPA2 Criteria Query查询的实体.
我可以加入其中两个实体并立即获得结果:
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<LadungRgvorschlag> criteriaQuery = criteriaBuilder.createQuery(LadungRgvorschlag.class);
Root<LadungRgvorschlag> from = criteriaQuery.from(LadungRgvorschlag.class);
Join<Object, Object> ladung = from.join("ladung");
from.fetch("ladung", JoinType.INNER);
Run Code Online (Sandbox Code Playgroud)
然后我尝试加入另外一个表:
ladung.join("ladBerechnet");
ladung.fetch("ladBerechnet", JoinType.LEFT);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=generatedAlias3,role=null,tableName=ladberechnet,tableAlias=ladberechn3_,origin=ladungen ladung1_,columns={ladung1_.id ,className=de.schuechen.beans.tms.master.LadBerechnet}}] [select generatedAlias0 from de.schuechen.beans.tms.master.LadungRgvorschlag as generatedAlias0 inner join generatedAlias0.ladung as generatedAlias1 inner join generatedAlias1.ladBerechnet as generatedAlias2 left join fetch generatedAlias1.ladBerechnet as generatedAlias3 inner join …Run Code Online (Sandbox Code Playgroud) 我正在使用Glassfish和JSF构建我的第一个Java EE Web应用程序.我对条件查询相当新,我有一个我需要执行的查询,但javaee6教程在示例上似乎有点薄.无论如何,我很难创建查询.
目标:我希望用最多的文档来存储公司.公司与文档具有OneToMany关系.Documents与多个表具有ManyToOne关系,"usertype"列区分它们.
MySQL查询:
SELECT USERID, COUNT(USERID) AS CNT
FROM DOCUMENTS
WHERE USERTYPE="COMPANY"
GROUP BY USERID
ORDER BY CNT DESC
Run Code Online (Sandbox Code Playgroud)
谢谢
--update--根据用户反馈,这是我到目前为止:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Documents> cqry = cb.createQuery(Documents.class);
//Intersting Stuff
Root<Documents> root = cqry.from(Documents.class);
Expression userid = root.get("userID");
Expression usertype = root.get("userType");
Expression count = cb.count(userid);
cqry.multiselect(userid, count);
Predicate userType = cb.equal(usertype, "COMPANY");
cqry.where(userType);
cqry.groupBy(userid);
cqry.orderBy(cb.desc(count));
//more boilerplate
Query qry = em.createQuery(cqry);
List<Documents> results = qry.getResultList();
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
Exception Description: Partial object queries are not allowed to maintain …Run Code Online (Sandbox Code Playgroud) 这是对此的进一步问题:
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Company> criteria = criteriaBuilder.createQuery( Company.class );
Root<Company> companyRoot = criteria.from( Company.class );
Join<Company,Product> products = companyRoot.join("dentist");
Join<Company, City> cityJoin = companyRoot.join("address.city");//Company->Address->City-city
criteria.where(criteriaBuilder.equal(products.get("category"), "dentist"), criteriaBuilder.equal(cityJoin.get("city"),"Leeds"));
Run Code Online (Sandbox Code Playgroud)
公司有地址,地址内有City-pojo和Country-Pojo.我该如何使用它JOIN?我尝试引用它,address.city但我收到了错误消息:
来自托管类型[EntityTypeImpl @ 1692700229:Company [javaType:class com.test.domain.Company descriptor:RelationalDescriptor(com.test.domain.Company - > [DatabaseTable(COMPANY)])的属性[address.city],映射:16]]不存在.
我有两个名为table1,table2的表.这两个表都有相同的字段.这两个表之间没有关系.我的要求是我想要table1中的所有记录,而不是table2中的记录.所以我使用Criteria API编写了一个查询.但它没有给出正确的结果.由于我是这个JPA和标准API的新手,任何人都可以指出我在做错的地方.以下代码我用来做这个.
CriteriaBuilder cb = mediationEntityManager.getCriteriaBuilder();
CriteriaQuery<Table1> cq = cb.createQuery(Table1.class);
Root<Table1> table1 = cq.from(Table1.class);
cq.select(table1)
Subquery<Table2> subquery = cq.subquery(Table2.class)
Root table2 = subquery.from(Table2.class)
subquery.select(table2)
cq.where(cb.not(cb.exists(subquery)))
TypedQuery<Table1> typedQuery = mediationEntityManager.createQuery(cq);
List<Table1> resultList = typedQuery.getResultList();
Run Code Online (Sandbox Code Playgroud)
MySQL查询:
SELECT table1
FROM table1 table1
WHERE NOT EXISTS (SELECT table2
FROM table2 table2
WHERE table2.name = table1.name
AND table2.education = table1.education
AND table2.age = table1.age)
AND table1.name = 'san'
AND table1.age = '10';
Run Code Online (Sandbox Code Playgroud)
我需要针对上述MySQL查询的JPA条件API查询.
我通过一种方法获得了我的实体类.我试图找出,如何通过JPA JPQL或Criteria API我可以发出截断或删除.我认为标准api对于使用类更自然,而truncate是一个更快的操作,所以这些是首选.这是我到目前为止所做的,但不确定要添加/更改的内容.
CriteriaBuilder cb = this._em().getCriteriaBuilder();
cb.createQuery( _entityClass() ).from( _entityClass() );
Run Code Online (Sandbox Code Playgroud)
注意:_entityClass返回MyEntity.class,我没有其他引用MyEntity这是一个更通用的实现.