标签: jpql

JPA为每个项目选择最新实例

假设我有一个会议实体.每次会议都有一位与会者和一个会面日期.在我的会议桌内,我可能会为每位与会者举行多次会议,每次会议的日期各不相同.我需要一个JPA查询,它只为所有与会者选择最新的会议.例如,如果我的表看起来像这样

Meeting ID | Attendee ID | Meeting Date
1          | 1           |  6/1/2011
2          | 2           |  6/1/2011
3          | 1           |  6/6/2011
4          | 3           |  6/6/2011
Run Code Online (Sandbox Code Playgroud)

我的结果应该是

Meeting ID | Attendee ID | Meeting Date
2          | 2           |  6/1/2011
3          | 1           |  6/6/2011
4          | 3           |  6/6/2011
Run Code Online (Sandbox Code Playgroud)

使用JPA 2对抗postgres.会议有1-1参加者和一个简单的时间戳日期.我怀疑我需要做一个小组by和max(blah),也许是一个加入我自己,但我不确定最好的方法来解决这个问题.

更新: 在晚上玩这个之后,我仍然没有可接受的JPQL解决方案.这是我到目前为止:

select m from Meeting m 
where m.meetingDate in 
    ( select max(meet.meetingDate) 
      from Meeting meet group by meet.attendee )
Run Code Online (Sandbox Code Playgroud)

我有其他与此问题无关的其他条件,例如由与会部门过滤等等.这有效的唯一原因是因为我们将会议日期跟踪到第二(或更精细),并且在同一时间召开两次会议的可能性很小.我们正在为它们添加一些Java内容,以便只为每个与会者提供最后一次会议,以防我们同时获得两个会议,但这是一个非常糟糕的解决方案.在查询中获取所有内容真的不应该太难,但我还没弄明白.

Update2:添加sql标签,因为如果我需要使用sql创建一个视图并创建一个JPA对象来映射到视图我就可以了.

java sql jpa jpql jpa-2.0

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

标准JPA 2有3个表格

我正在尝试创建一个标准来从3个表中检索一些对象(关联,更新和详细信息).详细信息引用了"关联"和"更新","更新"引用了"详细信息"列表.我的目标是在给定Associate id的情况下检索在指定字段中至少具有null值的Detail的更新列表.在JPQL中很容易做到,但客户说这必须用标准编码.

我的JPQL是:

public List<Update> getUpdates(long associateId) {
    TypedQuery<Update> query = em.createQuery("select distinct u from Update u, Detail dt, Associate a "
        + "where dt.update = u and dt.associate = a and a.associateId = :id and "
        + "dt.ack_date is null", Update.class);
    query.setParameter("id", associateId);
    return query.getResultList();
}
Run Code Online (Sandbox Code Playgroud)

我尝试了以下内容,但它只返回了数据库中的所有更新:

public List<Update> getUpdates(long associateId) {
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Update> query = builder.createQuery(Update.class);

    Root<Update> fromUpdates = query.from(Update.class);
    Root<Associate> fromAssociate = query.from(Associate.class);
    Root<Detail> fromDetail = query.from(Detail.class);

    Join<Detail, Associate> associateJoin = fromDetail.join("associate");
    Join<Detail, Update> …
Run Code Online (Sandbox Code Playgroud)

java jpql criteria-api jpa-2.0

21
推荐指数
2
解决办法
4万
查看次数

如何在JPQL或HQL中仅检索实体的某些字段?JPQL或HQL中的ResultSet等价物是什么?

在JPQL中,我可以通过以下方式检索实体:

query = entityManager.createQuery("select c from Category c");
List<Category> categories = query.getResultList();
Run Code Online (Sandbox Code Playgroud)

但是,如果我想检索Category实体的id和name字段(仅),我需要像ResultSet对象这样的东西,通过它我可以说:rs.getString("name")rs.getString("id").如何在JPQL不检索整个实体的情况下完成此操作?

基本上,对于如何从一个查询信息,如:select c.id,c.name from Category c

orm hibernate hql jpql

19
推荐指数
2
解决办法
5万
查看次数

JPA - 返回StartDate之后和EndDate之前的实体

我的实体有两个约会.即.

Date startDate;
Date endDate;
Run Code Online (Sandbox Code Playgroud)

我如何查询以便给定日期,它将返回指定日期位于startDate和之间的所有实体 endDate

我已经尝试过以下方法:

findByStartDateAfterAndEndDateBefore(Date givenDate);
Run Code Online (Sandbox Code Playgroud)

Spring-Data-JPA不喜欢这样并且遇到错误.没有特定的错误,repo就不能注入我的班级.

什么是正确的方法?我知道这可以通过Hibernate标准或使用Native SQL轻松完成,但尝试在Spring JPA中执行此操作.

这是查询本身的问题还是Spring使用的Date类型之间的某种不兼容性?

尝试findByStartDateAfterAndEndDateBefore(Date givenDate, Date givenDate)然后返回null.

java spring date jpql spring-data-jpa

19
推荐指数
3
解决办法
9546
查看次数

如何用布尔条件编写JPA查询

在我的项目中我使用JPA 2.0和eclipselink inplementation,我有以下问题:

我用boolean列定义了实体:

@Entity
public User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="USR_ID")
    private Short id;

    @Column(name="USR_NAME")
    private String name;

    @Column(name="USR_ACTIVE")
    private boolean active;

    .......

}
Run Code Online (Sandbox Code Playgroud)

我想创建将返回所有活动用户的查询,如下所示:

从用户u中选择你,其中u.active = TRUE;

但是,如果我使用该查询,我得到的异常是布尔值不能转换为Short(数据库中的列存储为smallint).有没有正确的方法来编写这个查询?

谢谢

eclipselink jpql jpa-2.0

18
推荐指数
2
解决办法
5万
查看次数

在JPQL中可以选择EXISTS()吗?

我正在尝试运行一个查询,检查某些条件是否为真,并返回一个简单的布尔结果作为输出.让它有点棘手的是,其中一个条件是测试是否没有为一组标准返回结果.

我目前正在使用JPA-2.0和hibernate作为我的提供者,由MySQL支持.我已经得到一个在MySQL中运行良好的示例查询,但是当试图让它在JPQL中运行时,它会失败.MySQL查询看起来有点像这样:

Select exists(Select statement with criteria) 
  or not exists(Select statement with criteria);
Run Code Online (Sandbox Code Playgroud)

我也使用CASE获得了相同的输出,但由于JPQL不支持该语句.

无论如何,当我尝试在JPQL中使用类似的查询时,我得到错误:

"意外结束的子树"

根据我的理解,这意味着查询中缺少某些内容.有谁知道如何解决它?

jpa jpql java-ee jpa-2.0

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

有没有办法获得结果集的JPA命名查询的计数大小?

我喜欢JPA中的命名查询的概念我将要做的静态查询,但我经常想要查询查询的计数结果以及查询的某个子集的结果列表.我宁愿不写两个几乎相同的NamedQueries.理想情况下,我想拥有的是:

@NamedQuery(name = "getAccounts", query = "SELECT a FROM Account")
.
.
  Query q = em.createNamedQuery("getAccounts");
  List r = q.setFirstResult(s).setMaxResults(m).getResultList();
  int count = q.getCount();
Run Code Online (Sandbox Code Playgroud)

因此,假设m为10,s为0,并且Account中有400行.我希望r有一个包含10个项目的列表,但我想知道总共有400行.我可以写第二个@NamedQuery:

@NamedQuery(name = "getAccountCount", query = "SELECT COUNT(a) FROM Account")
Run Code Online (Sandbox Code Playgroud)

但是,如果我总是想要计算,这似乎是一种干扰.在这个简单的情况下,很容易保持两者同步,但如果查询发生变化,我必须更新两个@NamedQueries以保持值一致,这似乎不太理想.

这里的一个常见用例是获取项目的某些子集,但需要某种方式来指示总计数("显示1-10的400").

java jpa jpql

17
推荐指数
2
解决办法
4万
查看次数

在JPA查询中转义冒号字符':'

我正在尝试通过使用":"字符的JPA运行本机查询.特定实例在查询中使用MySQL用户变量:

SELECT foo, bar, baz, 
    @rownum:= if (@id = foo, @rownum+1, 1) as rownum, 
    @id    := foo                         as rep_id 
FROM 
    foo_table 
ORDER BY 
    foo, 
    bar desc 
Run Code Online (Sandbox Code Playgroud)

JPA代码:

Query q = getEntityManager().createNativeQuery(query, SomeClass.class);
return q.getResultList();
Run Code Online (Sandbox Code Playgroud)

但是,这给了我一个例外,即不允许用空格跟随':'.我已经尝试用反斜杠逃避它们,我已经尝试通过将它们加倍来逃避它们.有没有办法真正做到这一点,还是我是SOL?

mysql jpa jpql

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

多对多查询jpql

我遇到了麻烦.

有一个实体分销商与实体城镇的ManyToMany关系连接:

@Entity
public class Distributor{

   @ManyToMany
   @JoinTable( name = "GS_DISTRIBUTOR_TOWN",
           joinColumns = @JoinColumn(name = "CD_DISTRIBUTOR"),
           inverseJoinColumns = @JoinColumn(name = "CD_TOWN") )
   private List<Town> towns;

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

然后实体城镇也与区有关

@Entity
public class Town{

   @ManyToMany(mappedBy="towns")
   private List<Distributor> distributors;

   @ManyToOne
   private District district;

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

现在我必须过滤(使用jpql)所有分区中的经销商.我能怎么做?

java jpa jpql jpa-2.0

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

使用Spring Data JPA和@Query注释仅获取第一个/最后一个元素

编辑:关于此问题的第二和第四个答案提供了解决此问题的解决方案有关Spring-Data-JPA注释的setMaxResults?

目标:使用Spring Data JPA存储库和Spring Query注释,按属性z获取最大/最小元素.

到目前为止我有什么

@Query("SELECT xelement FROM x xelement ORDER BY xelement.z")
public List<X> findFirstElement();
Run Code Online (Sandbox Code Playgroud)

问题:此查询获取所有元素(这不是真正有效).如果我直接使用EntityManager,我可以使用设置结果的数量

entityManager.setMaxResults(1)
Run Code Online (Sandbox Code Playgroud)

只获得第一个元素.

问题:如何使用@Query注释指定最大结果数?

想法:使用大小为0的PageRequest还是要走的路?

约束:我知道"FindFirstBy ...."查询功能,但我想/必须使用@Query注释.

java spring jpql spring-data-jpa

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

标签 统计

jpql ×10

java ×6

jpa ×5

jpa-2.0 ×5

spring ×2

spring-data-jpa ×2

criteria-api ×1

date ×1

eclipselink ×1

hibernate ×1

hql ×1

java-ee ×1

mysql ×1

orm ×1

sql ×1