Tag: 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 getQueryForApps(AppSearchObject aso) { … } … } 但是,当我运行应用程序时,我得到一行空指针exception: cb = em.getCriteriaBuilder(); 即EntityManager不会被注入。 你知道为什么吗? 此外,这是正确的和线程安全的,还是我应该为每个查询实例化我的InboxQueryBuilder? 在这种情况下,我是否应该注入EntityManager或者我应该将它作为构造函数参数传递(InboxQueryBuilder将为DAO中的每个查询实例化,其中有一个注入的EntityManager实例)?

使用Criteria API创建查询(JPA 2.0)

我正在尝试使用JPA 2.0中的Criteria API创建查询,但我无法使其工作。 问题在于“之间”条件方法。 我读了一些文档 ,知道我该怎么做,但是因为我发现了JPA,所以我不明白为什么它不起作用。 首先,当我写“Transaction_”时,我看不到应该出现的“creationDate”。 我认为这可能是正常的,因为我读过元模型是在运行时生成的,所以我尝试使用’Foo_.getDeclaredSingularAttribute(“value”)’而不是’Foo_.value’,但它仍然无法正常工作。 这是我的代码: public List getTransactions(Date startDate, Date endDate) { EntityManager em = getEntityManager(); try { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Transaction.class); Metamodel m = em.getMetamodel(); EntityType Transaction_ = m.entity(Transaction.class); Root transaction = cq.from(Transaction.class); // Error here. cannot find symbol. symbol: variable creationDate cq.where(cb.between(transaction.get(Transaction_.creationDate), startDate, endDate)); // […]

使用JPA2 Criteria API选择MAX时间戳

所以我的实体有: @Column(name=”TS”, nullable=false) private java.sql.Timestamp timestamp; 我生成的MetaModel具有: public static volatile SingularAttribute timestamp; 我想通过Max Timestamp值选择: Root root = query.from(MyEntity.class); Expression maxExpression = cb.max(root.get(MyEntity_.timestamp)); 但我不被允许,因为: max(Expression x)使用数值max运算创建聚合表达式。 Expression 当然Timestamp不会扩展Number 。 如何使用typesafe Criteria API在Timestamp列上执行MAX ? 谢谢。

下划线连接到类名是什么意思?

我正在阅读“JPA 2.0中的动态,类型安全查询”一文,并偶然发现了这个例子: EntityManager em = … CriteriaBuilder qb = em.getCriteriaBuilder(); CriteriaQuery c = qb.createQuery(Person.class); Root p = c.from(Person.class); Predicate condition = qb.gt(p.get(Person_.age), 20); // ^^ — this one c.where(condition); TypedQuery q = em.createQuery(c); List result = q.getResultList(); 我想知道,这里的下划线究竟是什么意思? 由于下划线是类名的有效部分,我不明白为什么可以在JPA中使用它。 我在我的代码中使用现有实体检查了这一点,当然我的类无法解析为ClassName_

Criteria Builder在Select语句中创建新对象

我想知道是否可以创建这样的查询: em.createQuery( “SELECT NEW EmpMenu(p.name, p.department.name) ” + “FROM Project p “).getResultList(); 也可以通过规范来做到这一点: public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { return ???; } 提前致谢!

使用JPA标准的“不在”约束

我正在尝试使用JPA Criteria编写NOT IN约束。 我尝试过这样的事情: builder.not(builder.in(root.get(property1))); 虽然我知道它不会起作用。 在上面的语法中,如何添加要检查的property1的集合/列表?

如何在具有枚举字段的实体上使用JPA CriteriaQuery填充DTO类字符串字段?

我正在使用JPA Criteria API,在我的查询多选中我想要检索枚举属性,而不是枚举本身。 这是我的查询: final CriteriaQuery query = builder.createQuery(MyClassDTO.class); 在MyClassDTO我有4个字段如下: private String icon; private String provenance; private int sizeX; private int sizeY; 我从中检索数据的路径是: final Root from = query.from(MyClass.class); MyClass有3个字段: @Column @Enumerated(EnumType.STRING) private EnumTileIcon enumTileIcon; @Column @Enumerated(EnumType.STRING) private EnumProvenance enumProvenance; @Column @Enumerated(EnumType.STRING) private EnumSize enumSize; 我想要做的是使用query.multiselect填充query.multiselect ,如下所示: query.multiselect( from.get(MyClass_.enumTileIcon.toString()), from.get(MyClass_.enumProvenance.name()), from.get(MyClass_.enumSize.getWidth()), from.get(MyClass_.enumSize.getHeight()) ); 我怎么解决这个问题?

Criteria API:按类类型过滤

我是关系数据库的新手,我在创建查询方面遇到了一些问题。 首先,我想尽快解释一下情况。 我有几个实体类。 所有这些都扩展了AbstractEntity或EntityProperty 。 因此实体可以拥有属性和属性拥有实体,因此存在双向关系。 现在让我们说ConcreteEntity扩展AbstractEntity并且我想创建这样的查询:获取ConcreteEntity类型的所有实体,其至少具有包含在给定列表propertyNames的名称的propertyNames 。 到目前为止,我有以下工作条件查询: CriteriaQuery cq = cb.createQuery(AbstractEntity.class); Root property = cq.from(EntityProperty.class); Join entity = property.join(EntityProperty_.owningEntities); cq.where(property.get(EntityProperty_.name).in((Object[]) propertyNames)); cq.select(entity); 但现在我只想要那些ConcreteEntity类型的实体。 我怎么能实现这个目标? 在JPQL中我写了“SELECT entity FROM EntityProperty property JOIN property.owningEntities entity”,在这里我也不知道如何以只返回特定类型的方式编写它… 提前谢谢你的答案! 编辑:将第二个问题移到条件查询:隐隐绰绰的结果列表并删除代码中的不同(不起作用)

完全动态创建JPA标准

通常我是Hibernate用户,对于我的新项目,我们使用JPA 2.0。 我的DAO收到一个带有通用的Container。 public class Container { private String fieldId; // example “id” private T value; // example new Long(100) T is a Long private String operation; // example “>” // getter/setter } 以下行将无法编译: if (“>”.equals(container.getOperation()) { criteriaBuilder.greaterThan(root.get(container.getFieldId()), container.getValue()); } 因为我必须指定这样的类型: if (“>”.equals(container.getOperation()) { criteriaBuilder.greaterThan(root.get(container.getFieldId()), (Long)container.getValue()); } 但我不想那样做! 因为我在容器中使用通用! 你有个主意吗?

JPA / Metamodel:Sun Docs中的奇怪(不一致?)示例

在Sun Online资源中 ,他们提供了关于Criteria / Metamodel API使用的儿子示例,但据我了解Java,似乎无法工作: CriteriaQuery cq = cb.createQuery(Pet.class); Metamodel m = em.getMetamodel(); EntityType Pet_ = m.entity(Pet.class); EntityType Owner_ = m.entity(Owner.class); Root pet = cq.from(Pet.class); Join address = cq.join(**Pet_.owners**).join(**Owner_.addresses**); Pet_是EntityType类的实例 ,它不定义任何名为owners或addresses属性。 他们确实为元模型定义了名为Pet_和Owner_类,但是在这里输入它们会与变量名称产生冲突……我是对的吗? __ (这个问题也与这个问题有关)