标签: criteria-api

EntityManager注入 - NullPointerException

在我的Spring + JPA/Hibernate + Wicket应用程序中,我有一个QueryBuilder bean,我想在我的一个DAO中使用它,它在Criteria API的帮助下生成一个类型查询:

@Service(value="inboxQueryBuilder")
public class InboxQueryBuilder {

    @PersistenceContext
    EntityManager em;

    CriteriaBuilder cb;

    public InboxQueryBuilder() {
        cb = em.getCriteriaBuilder();
    }

    public TypedQuery<App> getQueryForApps(AppSearchObject aso) {
           ...
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行应用程序时,我得到一个行的空指针异常:

cb = em.getCriteriaBuilder();
Run Code Online (Sandbox Code Playgroud)

即EntityManager不会被注入.你知道为什么吗?

此外,这是正确的和线程安全的,还是我应该为每个查询实例化我的InboxQueryBuilder?在这种情况下,我是否还应该注入EntityManager或者我应该将它作为构造函数参数传递(InboxQueryBuilder将为DAO中的每个查询实例化,其中有一个注入的EntityManager实例)?

java spring dao jpa criteria-api

3
推荐指数
1
解决办法
1万
查看次数

JPA:如何在静态JPA MetaModel中使用NUMBER列执行LIKE?

我确实有一个带有NUMBER(实际上是BigDecimal,不要问为什么)列的静态元模型.现在我想对该数字列进行LIKE查询:

CriteriaBuilder cb;
cb.like(entity.get(Entity_.numbercol), "123%");
Run Code Online (Sandbox Code Playgroud)

哪里entity.get(Entity_.numbercol)返回一个Path<BigDecimal>.当然,我得到一个编译错误:...like(Expression<String>, ...) ... not applicable for the arguments (Path<BigDecimal>, ...)

.as(String.class)由于JPA中存在一些错误而导致列失败,但我现在手头没有错误编号.但是,在最新版本的JPA/Hibernate中并没有修复它.无论如何,它会导致生成一些无效SQL语句的运行时异常.

现在我只需要一种方法来获得与SQL相当的标准API

... WHERE numbercol LIKE '123%';
Run Code Online (Sandbox Code Playgroud)

搜索主题已经提出了以下响应,这没有帮助,因为我有一个静态元模型: NHibernate - 使用Criteria API对整数列进行LIKE搜索的最简单方法?JPA/Criteria API - 喜欢和平等的问题

有任何想法吗?

在此先感谢Dominik

hibernate jpa criteria-api metamodel jpa-2.0

3
推荐指数
1
解决办法
5946
查看次数

Hibernate with ProjectionList错误:无法强制转换为[Ljava.lang.Object;

我的对象的returnig列表有问题.我正在使用实体类,@EmbeddedId正如你在下面的代码中看到的那样,其中有两行文字相似:id.*.

Criteria cr = createCriteria(true);
cr.add(Restrictions.eq("id.qwerty", "QWERTY"));

ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.property("id.qwerty"));
projectionList.add(Projections.property("text"));
projectionList.add(Projections.property("id.property"));
cr.setProjection(projectionList);
cr.setResultTransformer(Transformers.aliasToBean(My.class));

List<My> myList = (List<My>) cr.list();

return myList;
Run Code Online (Sandbox Code Playgroud)

在线List<My> messagesList = (List<My>) cr.list();,发生以下错误.

java.lang.ClassCastException: my.package.dao.domain.My cannot be cast to [Ljava.lang.Object;
at org.hibernate.cache.StandardQueryCache.put(StandardQueryCache.java:104)
at org.hibernate.loader.Loader.putResultInQueryCache(Loader.java:2274)
at org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2206)
at org.hibernate.loader.Loader.list(Loader.java:2164)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1706)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
Run Code Online (Sandbox Code Playgroud)

我如何定义CriteriaProjectionList在这种情况下?

编辑

@javax.persistence.Entity
@Table(name = "my_table")
public class My extends MyEntity<MyPK> {

   @EmbeddedId
   private MyPK id;

   @Column(name = "text", nullable = …
Run Code Online (Sandbox Code Playgroud)

java hibernate projection criteria-api

3
推荐指数
1
解决办法
7316
查看次数

使用CriteriaBuilder进行JPA + Hibernate计数(*) - 使用generatedAlias

尝试count(*)使用CriteriaBuilder我创建类型查询时,我得到以下别名问题.

我应该对下面的代码进行哪些更改才能获得计数?

约束:

  1. 我必须使用CriteriaBuilder/Query,因为必须根据值动态构建where子句.
  2. 我只需要COUNT,而不是内存中的对象列表.

代码示例代码段:

 Class<ReqStatCumulative> entityClass = ReqStatCumulative.class;
 @Override
    public long getCountForAlertConfig(AlertConfig cfg) {
        long count = 0L;
        if (null != cfg) {
            CriteriaBuilder qb = entityManager.getCriteriaBuilder();

            Metamodel model = entityManager.getMetamodel();
            EntityType<ReqStatCumulative> reqStatEntType_ = model.entity(entityClass);
            CriteriaQuery<ReqStatCumulative> cq = qb.createQuery(entityClass);
            Root<ReqStatCumulative> rootReqStatEnt = cq.from(reqStatEntType_);
            Path<Long> processTimeSeconds = rootReqStatEnt.<Long> get("processTimeSeconds");
            cq.where(qb.and(qb.greaterThan(processTimeSeconds, (long) cfg.getProcessTimeExceedsSec()),//
                    qb.lessThan(processTimeSeconds, (long) cfg.getProcessTimeExceedsSec() + 100))//
            );//
            findCountByCriteria(entityManager, cq, qb);
            log.debug("\n\t#####Alert desc:" + cfg.getDescription());
            log.debug("\n\t#####Alert count= " + count);
        } else {
            // Do …
Run Code Online (Sandbox Code Playgroud)

hibernate jpa criteria-api

3
推荐指数
1
解决办法
2万
查看次数

JPA CriteriaBuilder - 按一对多关系中的关联实体数量排序

我有两个实体Customer和Order一对多关系.对于每个客户,我需要计算相关订单的数量,并按此数字对结果进行排序.在本机postgres查询中,它看起来像这样:

select cust.id, count(order.id) from customers cust
left outer join orders order
on cust.id = order.customer_id
where .... conditions ...
group by cust.id
order by count desc;
Run Code Online (Sandbox Code Playgroud)

但我必须使用CriteriaBuilder执行此操作,因为此查询是使用CriteriaBuilder添加其他条件的更大代码段的一部分.在Hibernate中我可能会使用Projections,但我在JPA中找不到类似的东西.

任何使用CriteraBuilder编写查询的帮助都将非常感激.

先感谢您.

java hibernate jpa criteria-api

3
推荐指数
1
解决办法
1万
查看次数

在基于LazyDataModel的排序/过滤字段创建JPA条件查询时,删除if-else梯形图

我正在使用,

  • JPA 2.0
  • Mojarra 2.1.9
  • JSF组件库,Primefaces 3.5.
  • MySQL 5.6.11

我在MySQL数据库中有一个state_table以三列命名的表作为示例.

  • state_id(BigInt)
  • state_name(Varchar)
  • country_id(BigInt)

state_id是一个自动生成的主键,country_id是一个引用country表的主键的外键.


该表由其对应的实体类映射,StateTable该表持有的数据显示在Primefaces DataTable<p:dataTable>...</p:dataTable>.

所述DataTable列标题中包含一个可点击的排序区,<div>用于与用于分选,当该区域被点击时,一个字符串,可以是排序方向的每一列ASCENDINGDESCENDING表示排序顺序呈现和用于其中用户输入滤波(搜索)的文本框每列的搜索项.


所以最终,我在JSF托管bean中获得的是一个类型List,java.util.List<org.primefaces.model.SortMeta>表示DataTable用户希望的列的排序顺序.

并且将java.util.Map<java.lang.String, java.lang.String>表示搜索列的类型的映射名称作为键并将相应列的搜索项作为值(用户在每列的列标题上的文本框中输入搜索项DataTable).


简而言之,我List<SortMeta>用于排序和Map<String, String>过滤/搜索.

在排序和过滤后获取行列表的其中一个DAO中的代码如下所示.

@Override
@SuppressWarnings("unchecked")
public List<StateTable> getList(int first, int pageSize, List<SortMeta> multiSortMeta, Map<String, String>filters)
{
    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    CriteriaQuery<StateTable> criteriaQuery = criteriaBuilder.createQuery(StateTable.class);
    Metamodel metamodel=entityManager.getMetamodel();
    EntityType<StateTable> entityType …
Run Code Online (Sandbox Code Playgroud)

java criteria-api primefaces jsf-2 jpa-2.0

3
推荐指数
1
解决办法
2014
查看次数

在JPA中使用Coalesce或Case语句

如何使用coalescecase statement在JPA 2中使用CriteriaBuilder

对于许多已启动的记录,它们将为空,因此对于这些记录,employeeName将为null.我想显示System Generated如果employeeName对于那些在数据库表中initiateBy employee为null的项目为null.

我在实体中有以下关系

项目

@Entity
@Table(name = "PROJECT") 
public class Project {

@Id
@Column(name = "PROJECTID")
private Long projectId;
....
....

@ManyToOne
@JoinColumn(name = "EMPLOYEENUMBER", referencedColumnName = "EMPLOYEENUMBER")
private Employee empNumber;

@ManyToOne
@JoinColumn(name = "INITIATEDBY", referencedColumnName = "EMPLOYEENUMBER")
private Employee initiatedBy;
Run Code Online (Sandbox Code Playgroud)

雇员

@Entity
@Table(name = "EMPLOYEES")
public class Employee {

@Id
@Column(name = "EMPLOYEENUMBER")
private String employeeNo;

@Column(name = "EMPLOYEENAME")
private String employeeName;
.....
.....

@OneToMany(mappedBy = "empNumber") …
Run Code Online (Sandbox Code Playgroud)

hibernate jpa coalesce criteria-api jpa-2.0

3
推荐指数
1
解决办法
1万
查看次数

如何生成OR语句的谓词数组

我试图使用Criteria API而不是像JPQL Strings一样构造查询,因为Criteria API似乎更适合这个.但是,我在理解如何构造以下两个语句时遇到了一些问题.

SELECT e 
FROM Subject e 
WHERE e.company = :c1 
OR e.company = :c2 
OR e.company = :c3
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我需要迭代未知数量的值(c1,c2,c3等)以匹配相同的属性.

SELECT e 
FROM Subject e 
WHERE e.company 
LIKE :c1 
OR e.account 
LIKE :c1 
OR e.email 
LIKE :c1
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我需要传入单个值(c1)并对特定范围的属性进行"LIKE"比较.

我目前的模式看起来像这样:

// Criteria
CriteriaBuilder builder = subjectDAO.criteriaBuilder();
CriteriaQuery<Subject> query = builder.createQuery(Subject.class);

// Root
Root<Subject> subject = query.from(Subject.class);

List<Predicate> predicates = new ArrayList();

for (String property : map.keySet()) {
    String value = (String) coreFilter.get(map);
    predicates.add(????? This is where I come unstuck …
Run Code Online (Sandbox Code Playgroud)

jpa criteria-api

3
推荐指数
1
解决办法
9800
查看次数

如何在某些单元格上使用自定义操作的CriteriaQuery SUM?

考虑你有表T,字段A和B.

使用常规SQL,我可以这样做:

SELECT SUM(A * (100.0 - B) / 100.0) AS D FROM T;
Run Code Online (Sandbox Code Playgroud)

而且我会得到我所期望的.

但是,我不确定如何使用CriteriaQuery.

我知道如何对1个字段求和,但不知道如何在一行中的多个字段上对某些数学表达式求和.

java sql expression aggregate-functions criteria-api

3
推荐指数
1
解决办法
1万
查看次数

JPA Criteria:包含许多列的子句

我试图使用JPA Criteria API编写以下SQL查询

SELECT * FROM Table1 a
WHERE (a.category, a.priority) IN (
SELECT a1.category, max(a1.priority) FROM Table1 a1 GROUP BY a1.category
)
Run Code Online (Sandbox Code Playgroud)

在功能上,查询选择Table1的元素,每个类别具有最高优先级.

categoryPriority = // defines the pair category/priority
mySubQuery = // defines the subquery
query.where(categoryPriority.in(mySubQuery)
Run Code Online (Sandbox Code Playgroud)

这是我正在寻找的示意图.

定义子查询不是问题,因为它有详细记录.

但我找不到定义这对夫妇的方法(a.category,a.priority).

jpa in-clause criteria-api

3
推荐指数
1
解决办法
2634
查看次数