给定
@Entity
public class Document {
@Id
@Column(name = "DOCUMENT_ID")
private Long id;
@ElementCollection
@CollectionTable(
name="TAG",
joinColumns=@JoinColumn(name="DOCUMENT_ID")
)
@Column(name="TAG")
private Set<String> tags;
}
Run Code Online (Sandbox Code Playgroud)
查找带有特定标签集合的所有文档。本质上,EclipseLink 相当于:
SELECT d FROM Document d WHERE :tag1 MEMBER OF d.tags
INTERSECT
SELECT d FROM Document d WHERE :tag2 MEMBER OF d.tags
...
SELECT d FROM Document d WHERE :tagn MEMBER OF d.tags
Run Code Online (Sandbox Code Playgroud)
但使用 JPA CritieraQuery。
我刚刚在代码中添加了一个谓词条件,它可以很好地解析列,但不确定为什么会出现错误:
ERROR com.sl.web.controller.AbstractController logError- Exception occur in Controller: null.
java.lang.NullPointerException
at org.hibernate.ejb.criteria.predicate.ComparisonPredicate.render(ComparisonPredicate.java:178)
at org.hibernate.ejb.criteria.predicate.CompoundPredicate.render(CompoundPredicate.java:133)
at org.hibernate.ejb.criteria.predicate.CompoundPredicate.render(CompoundPredicate.java:128)
at org.hibernate.ejb.criteria.QueryStructure.render(QueryStructure.java:258)
at org.hibernate.ejb.criteria.CriteriaQueryImpl.render(CriteriaQueryImpl.java:340)
at org.hibernate.ejb.criteria.CriteriaQueryCompiler.compile(CriteriaQueryCompiler.java:217)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:587)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)
at $Proxy57.createQuery(Unknown Source)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:443)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:294)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:334)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:319)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeRepositoryPostProcessor.java:84)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy110.findAll(Unknown Source)
at com.smartlead.service.impl.DealerManageEnrollmentsServiceImpl.findDealersEnrollmentDataViewByCriteria(DealerManageEnrollmentsServiceImpl.java:126) …Run Code Online (Sandbox Code Playgroud) 我需要StateTable根据表中给定的国家/地区名称(不是countryId)搜索州Country,该名称应like使用 JPA 标准 API 与 SQL 运算符匹配(顾名思义,countryId是外键)。StateTable
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<StateTable> criteriaQuery = criteriaBuilder
.createQuery(StateTable.class);
Root<StateTable>root=criteriaQuery.from(StateTable.class);
List<Predicate>predicates=new ArrayList<Predicate>();
predicates.add(criteriaBuilder
.like(root.<String>get("countryName"), "%"+countryName+"%"));
criteriaQuery.where(predicates.toArray(new Predicate[0]));
entityManager.createQuery(criteriaQuery)
.setFirstResult(first)
.setMaxResults(pageSize)
.getResultList();
Run Code Online (Sandbox Code Playgroud)
如何修改以下语句以满足需要?(同样countryName在表中可用Country,并且此条件查询是关于StateTable)。
predicates.add(criteriaBuilder
.like(root.<String>get("countryName"), "%"+countryName+"%"));
Run Code Online (Sandbox Code Playgroud)
使用 JPQL 很乏味,因为需要为多个搜索条件构建查询。这只是一个演示/说明。
实体Country:
@Entity
public class Country implements Serializable {
@Id
private Long countryId; //<----------------------
@Column(name = "country_name")
private String countryName;
@Column(name = "country_code")
private String …Run Code Online (Sandbox Code Playgroud) 我有三个表,其中一个是 ItemCategory、ItemMaster 和 Price。我在 ItemMaster 表中引用 itemaCategoryId,就像在价格中引用 itemmasterid 一样。现在我必须按 itemcategory id 显示价格订单的内容。这是我的标准查询。
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Price> cq = cb.createQuery(Price.class);
Root<Price> root = cq.from(Price.class);
Root<ItemMaster> itemMasterRoot = cq.from(ItemMaster.class);
Root<ItemCategory> itemCategoryRoot = cq.from(ItemCategory.class);
Join<ItemMaster, ItemCategory> s=itemMasterRoot.join(ItemMaster_.category);
Join<Price,ItemMaster> y=root.join(Price_.itemMaster);
Path<Long> itemMasterId=root.get(Price_.itemMasterId);
cq.select(root).where(cb.equal(root.get(Price_.priceMasterId), priceMasterId))
.orderBy(cb.asc(itemMasterId));
TypedQuery<Price> q = entityManager.createQuery(cq);
Run Code Online (Sandbox Code Playgroud)
高于我的标准查询
我正在努力使用 JPA Criteria API 来为我的数据结构制定查询。好的,我的实体如下。我有用户和组(两者共享一个公共基类 OrgEntity)。从逻辑上讲,用户当然可以是多个组的成员。最后,我有一个代表任务的实体,它有一个潜在所有者的列表(可以是单个用户或整个组)。领域模型总结如下并给出,因此我无法更改它。
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
abstract public class OrgEntity {
@Id
public String name;
...
}
@Entity
public class User extends OrgEntity {
public String displayName;
@ManyToMany(mappedBy="members")
public List<Group> groups;
...
}
@Entity
public class Group extends OrgEntity {
@ManyToMany
public List<User> members;
...
}
@Entity
public class Task {
@Id
public String uuid;
@ManyToMany
public List<OrgEntity> potentialOwners;
...
}
Run Code Online (Sandbox Code Playgroud)
我的查询的起点是 User 的单个实例。我想知道用户是潜在所有者的所有任务(无论用户是否直接包含在潜在所有者集合中或潜在所有者中包含的组的成员)。
我第一次尝试使用命名查询如下
SELECT DISTINCT t FROM Task AS t JOIN t.potentialOwners po
WHERE (po IN …Run Code Online (Sandbox Code Playgroud) 我将MySQL用作应用程序的后端。
我想使用JPA条件查询执行以下查询。
SELECT *
FROM table1 t1
WHERE datediff(now(), t1.created) >= 20;
Run Code Online (Sandbox Code Playgroud)
注意:的类型created为TIMESTAMP
我想要条件查询,例如:
CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
// select
CriteriaQuery<Table1> query = cb.createQuery(Table1.class);
// from
Root<Table1> root = query.from(Table1.class);
// where
List<Predicate> predicates = new ArrayList<Predicate>();
// TODO: add expression for datediff(now(), t1.created) >= 20
query.where(cb.and(predicates.toArray(new Predicate[0])));
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
提前致谢。
有很多技术可以使用 Java 访问数据。我正在阅读其中一些,包括:
现在我真的很困惑,因为开销很大。这些技术之间的主要区别和相似之处是什么?哪些是最常用的?简短的比较非常受欢迎。
我已经实现了一个我的自定义 Spring 存储库,它在输入中接收一个org.springframework.data.domain.Pageable对象。此Pageable对象具有以下排序属性(例如):id: DESC,name: ASC.
我需要将pageable.getSort()属性转换为 aList<Order>以便为该criteriaQuery.orderBy(List<Order>)方法设置顺序。
为了检索分页结果,我使用了new PageImpl将pageable对象传递给它的方法,但这不管理排序。
TypedQuery<Entity> typedQuery = entityManager.createQuery(criteriaQuery);
typedQuery.setFirstResult(pageable.getOffset());
typedQuery.setMaxResults(pageable.getPageSize());
Page<Entity> page = new PageImpl<Entity>(typedQuery.getResultList(), pageable, typedQuery.getMaxResults());
return page;
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?谢谢,安德里亚
我正在使用 jhipster 标准和 jpa 规范来实现用于研究的端点。
好吧,它正在工作,但继续向我发送重复项。
有这个模型的prestations
public class Prestation extends AbstractAuditingEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private Long id;
@NotNull
@Column(name = "jhi_label", nullable = false)
private String label;
@Column(name = "description")
private String description;
@Column(name = "unit")
private String unit;
@NotNull
@Column(name = "activated", nullable = false)
private boolean activated;
@ManyToOne(optional = false)
@NotNull
@JsonIgnoreProperties("prestations")
private SubCategory subCategory;
@OneToMany(mappedBy = "prestation", cascade = …Run Code Online (Sandbox Code Playgroud) 我正在尝试允许来自 Web 前端的用户搜索数据库中的某些属性。属性名称可能包含like 中使用的特殊SQL 字符% 和_。有没有办法转义特殊字符?
我在 Glassfish 5.1、Apache Derby、JPA 2.1 和 EclipseLink 2.7.4 中使用 Criteria API。
其他数据库使用 \ 作为默认转义字符,但 Derby 不使用。从阅读来看,似乎严格的标准要求没有隐式转义字符。
我将用这个数据来说明:
ID SETNAME DESCRIPTION
----------------------------------------------
1 Set_1 The very first set
2 Set%2 The second set
Run Code Online (Sandbox Code Playgroud)
和 SQL 通过 JDBC 直接到 Derby。这些表是从以下实体生成的。
SELECT * FROM ATTRIBUTESETMETA WHERE SETNAME LIKE 'Set%2'
Run Code Online (Sandbox Code Playgroud)
如您所料,返回两行(% = 通配符)。
我希望在 Criteria API 中复制以下内容
SELECT * FROM ATTRIBUTESETMETA WHERE SETNAME LIKE 'Set\%2' ESCAPE '\'
Run Code Online (Sandbox Code Playgroud)
它只返回第一行,因为 \ 被显式设置为转义字符。
如果我使用
SELECT * FROM ATTRIBUTEMETA WHERE SETNAME LIKE …Run Code Online (Sandbox Code Playgroud)