假设我有一个会议实体.每次会议都有一位与会者和一个会面日期.在我的会议桌内,我可能会为每位与会者举行多次会议,每次会议的日期各不相同.我需要一个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对象来映射到视图我就可以了.
我正在尝试创建一个标准来从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) 在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?
我的实体有两个约会.即.
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.
在我的项目中我使用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).有没有正确的方法来编写这个查询?
谢谢
我正在尝试运行一个查询,检查某些条件是否为真,并返回一个简单的布尔结果作为输出.让它有点棘手的是,其中一个条件是测试是否没有为一组标准返回结果.
我目前正在使用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中的命名查询的概念我将要做的静态查询,但我经常想要查询查询的计数结果以及查询的某个子集的结果列表.我宁愿不写两个几乎相同的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").
我正在尝试通过使用":"字符的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?
我遇到了麻烦.
有一个实体分销商与实体城镇的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)所有分区中的经销商.我能怎么做?
编辑:关于此问题的第二和第四个答案提供了解决此问题的解决方案有关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注释.