Tag: criteria api

JPA CriteriaQuery按最新子项属性排序

我有2个实体:Project和ProjectStatus。 项目实体: @Entity public class Project { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; @OneToMany(mappedBy = “project”) private List projectStatusses; } 项目状态实体: @Entity public class ProjectStatus { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; @ManyToOne private Project project; @Enumerated(EnumType.STRING) private ProjectStatusType statusType; } 我想用CriteriaQuery.orderBy按其最新状态类型订购项目。 我想出了以下内容: CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Project.class); Root root = criteriaQuery.from(Project.class); Join join = root.join(“projectStatusses”, […]

如何构建一个动态查询,该查询添加了迄今为止的天数,并使用条件API将该日期与另一个日期进行比较?

我有一张A桌和一张B桌。 JPA entity ,A和B类都有joda.time.datetime Persistent Field分别表示retentionDate和lastmodifiedDate 。 A还有一个类型为int Persistent Field 。 现在我想将add number of a.days到a.retentionDate ,然后使用JPA criteria API将其与b.lastmodifiedDate进行比较。 实体类 @Entity @Table(name = “A”) @Data @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) @EqualsAndHashCode(of = “id”, callSuper = false) public class A extends AbstractBaseEntity { @Id @GeneratedValue(generator = “uuid”) @GenericGenerator(name = “uuid”, strategy = “uuid2”) @Column(unique = true, length = […]

没有元模型使用的JPA 2 Criteria API不区分大小写的条件

如何在没有元模型使用的情况下创建不区分大小写的条件查询? 我正在尝试做这样的事情: CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery criteria = builder.createQuery(Resident.class); Root personRoot = criteria.from(Resident.class); criteria.where(builder.and( builder.equal(builder.upper(personRoot.get(“firstName”)), filter.getFirstName())), //ERROR builder.equal(personRoot.get(“lastName”), filter.getLastName())); 但它会产生错误: 接口javax.persistence.criteria.CriteriaBuilder中的方法upper不能应用于给定的类型; 需要[ERROR]:找到javax.persistence.criteria.Expression [ERROR]:javax.persistence.criteria.Path

Hibernate Criteria – 返回列不同的记录

示例数据库表: ID = 1,msgFrom =’你好’,foobar =’meh’ ID = 2,msgFrom =’再见’,foobar =’评论’ ID = 3,msgFrom =’Hello’,foobar =’response’ 示例所需的输出(由hibernate查询生成): ID = 1,msgFrom =’你好’,foobar =’meh’ ID = 2,msgFrom =’再见’,foobar =’评论’ 在上面的示例中,第三条记录将从结果中排除,因为msgFrom列是相同的。 假设Java / Hibernate类叫做Message。 我希望结果作为Message对象列表(或者可以转换为Message的对象)返回。 我希望尽可能使用Criteria API。 我在SO上看到了这个例子,看起来很相似,但我还是无法正确实现它。 select e from Message e where e.msgFrom IN (select distinct m.msgFrom from Message m WHERE m.msgTo = ? AND m.msgCheck […]

为什么Hibernate内联传递给JPA Criteria Query的整数参数列表?

我正在使用JPA Criteria API构建查询。 当我使用javax.persistence.criteria.Path#in(Collection)方法创建两个限制谓词时,生成的SQL查询与我所考虑的略有不同。 构建在int属性上的第一个谓词生成了SQL,内联参数集合的所有元素: in (10, 20, 30) 。 构建在String属性上的第二个谓词产生了参数化的SQL: in (?, ?, ?) 。 让我展示: 实体: @Entity public class A { @Id private Integer id; private int intAttr; private String stringAttr; //getter/setters } 查询: CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery q = cb.createQuery(A.class); Root root = q.from(A.class); q.where( root.get(“intAttr”).in(Arrays.asList(10, 20, 30)), root.get(“stringAttr”).in(Arrays.asList(“a”, “b”, “c”)) […]

如何将JPA中的自定义函数转换为谓词?

我有一个自定义的函数实现(接口SQLFunction ),如下所示: public class FilterFunction implements SQLFunction { @Override public boolean hasArguments() { return true; } @Override public boolean hasParenthesesIfNoArguments() { return false; } @Override public Type getReturnType(Type firstArgumentType, Mapping mapping) throws QueryException { return StandardBasicTypes.STRING; } @Override public String render(Type firstArgumentType, List arguments, SessionFactoryImplementor factory) throws QueryException { return arguments.get(0).toString(); } } 所以它只需要一个参数并用它替换函数。 SQL可能如下所示: […]

在基于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 , … 。 DataTable列标题包含一个可单击的排序区域,每个列的 以及用于排序的排序方向,单击此区域时,将显示一个字符串,表示呈现排序顺序的DESCENDING或DESCENDING以及用于过滤的文本框(搜索)其中用户输入每列的搜索项。 因此,最终,我在JSF托管bean中得到的是一个类型为java.util.List的List,表示用户希望的DataTable列的排序顺序。 并且类型为java.util.Map表示搜索列名称作为键,并将相应列的搜索项作为值(搜索项由用户输入DataTable每列的列标题上的文本框)。 简而言之,我使用List进行排序,使用Map进行过滤/搜索。 在排序和过滤后获取行列表的其中一个DAO中的代码如下所示。 @Override @SuppressWarnings(“unchecked”) public List getList(int first, int pageSize, List multiSortMeta, Mapfilters) { CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(StateTable.class); Metamodel metamodel=entityManager.getMetamodel(); EntityType entityType = metamodel.entity(StateTable.class); Rootroot=criteriaQuery.from(entityType); Join join […]

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; 但我必须使用CriteriaBuilder执行此操作,因为此查询是使用CriteriaBuilder添加其他条件的更大代码段的一部分。 在Hibernate中我可能会使用Projections,但我在JPA中找不到类似的东西。 任何使用CriteraBuilder编写查询的帮助都将非常感激。 先谢谢你。

Hibernate Criteria Api是否完全防止SQL注入

我正在使用Hibernate保护我的网站免受SQL注入。 我听说Hibernate Criteria API比HQL更强大。 Hibernate Criteria Api是否完全防止SQL注入?

如何在JPA critera API中做一个独特的计数?

我想这样做,但使用标准API代替: select count(distinct e) from Event e, IN(e.userAccessPermissions) p where p.principal = :principal and p.permission in (:permissions) 有任何想法吗?