我正在使用Spring JPA来执行所有数据库操作.但是我不知道如何从Spring JPA中的表中选择特定的列?
例如:
SELECT projectId, projectName FROM projects
是否可以从EntityManager获取Hibernate Session对象?我想访问一些特定于hibernate的API ...
我已经尝试过类似的东西:
org.hibernate.Session hSession =
( (EntityManagerImpl) em.getDelegate() ).getSession();
Run Code Online (Sandbox Code Playgroud)
但是只要我在EJB中调用一个方法,我就会得到"在EJB上调用期间发生系统异常",并带有NullPointerException
我使用glassfish 3.0.1
我如何获得自定义对象列表,如查询下面的结果:
SELECT p.category.id, count(p.id) FROM Product p left join p.category c WHERE p.seller.id=:id GROUP BY c.id
Run Code Online (Sandbox Code Playgroud)
举例:
return getEntityManager().createQuery("SELECT p.category.id, count(p.id) FROM Product p left join p.category c WHERE p.seller.id=:id GROUP BY c.id").setParameter("id", id).getResultList();
Run Code Online (Sandbox Code Playgroud)
我需要一张类别ID和类别中的产品数量的地图.
这是一个从我这里的另一个问题衍生出来的问题。我认为最好在有人(@Franck)指出这个链接和这个链接之后提出一个不同的问题。
我对如何使用 JPA Criteria API 在数据库日期列(在我的例子中是 MySQL DATETIME)中搜索字符串感到困惑。
这是我所做的;
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Client> cq = cb.createQuery(Client.class);
Root<Client> entity = cq.from(Client.class);
cq.select(entity);
List<Predicate> predicates = new ArrayList<Predicate>();
predicates.add(cb.like(cb.lower(entity.get("dateJoined").as(String.class)), "%"+search.toLowerCase()+"%"));
cq.where(predicates.toArray(new Predicate[]{}));
TypedQuery<Client> query = em.createQuery(cq); //<--- Error gets thrown here
return query.getResultList();
Run Code Online (Sandbox Code Playgroud)
但它失败了,但有以下例外;
Run Code Online (Sandbox Code Playgroud)java.lang.IllegalArgumentException: Parameter value [%10-2015%] did not match expected type [java.lang.Character]
10-2015正在搜索的字符串在哪里;
我被困在如何实现这一目标上。我需要帮助。
我实际上是在使用不同的过滤器进行研究。
当我使用JpaRepository进行简单查询时,我发现JpaSpecificationExecutor可以使用Criterias进行动态查询。
我的问题是我需要使用group by和count()创建一个复杂的查询。分组依据是可以的,但是我找不到如何覆盖“选择”部分来放置“计数”指令的方法。
有人可以帮我吗?
我正在使用spring 3.1.2和spring-jpa-data 1.0.3这是我的代码:
return new Specification< Article >() {
@Override
public Predicate toPredicate(final Root<Article> root,
final CriteriaQuery<?> query, final CriteriaBuilder builder) {
//count ???
query.groupBy(root.get(Article_.id));
Predicate p = builder.and(builder.like(root.<String> get(Article_.title), "%" + title + "%"));
return p;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢 !
JPQL 使这种更改非常容易:
Select o from Orders as o where....
Select o.id from Orders as o where....
Run Code Online (Sandbox Code Playgroud)
但在标准查询中:
CriteriaBuilder builder = kem.getCriteriaBuilder();
CriteriaQuery<Orders> query = builder.createQuery(Orders.class);
Root<Order> orders= query.from(Orders.class);
query.select(orders);
....
Run Code Online (Sandbox Code Playgroud)
看起来选择项是由 builder.createQuery(Order.class) 定义的,没有任何灵活性。
我知道我们可以使用 Tuple.class,但除了喜欢之外,还有什么更好的方法可以从复杂的查询中获得额外的 id(只有一个字段)?没有这样的特征标准查询变得非常缺乏灵活性。