回答

收藏

JPA选择计数不同

技术问答 技术问答 240 人阅读 | 0 人回复 | 2023-09-14

我需要一个相对简单的查询,但是JPA使其很难创建。; Q' _2 k; b0 L" _- ~7 d
SQL变量如下所示:" [. v& r" j( m. ?  g$ o' b
SELECT COUNT(DISTINCT OrderID) AS DistinctOrders FROM Orders WHERE CustomerID=7;& v# L% j" C' \- c' q
[编辑:OrderID不是主键。表格中可以有更多等于的OrderId]
9 g) ?' b8 X4 U: I我需要设置CustomerID一个传递给我的方法的变量。
9 ^3 F) M  A( J我找到了文档,CriteriaQuery distinct()但似乎无法将它们全部包装在一起。$ x' E- i/ o5 b: I4 M9 O
这是我到目前为止的内容:0 \5 `. N) Q! B. a; j  H1 [
CriteriaBuilder cb = this.em.getCriteriaBuilder();
1 n! y) o2 J: B$ [CriteriaQuery c = cb.createQuery( Order.class );
6 p& ]$ f% _3 @* }# X6 sRoot order = c.from( Order.class );
; ?" C# j) @% t$ v( @; y) PPath customerID = order.get( "customerID" );
" M, e$ a7 d4 k$ N8 a8 Nc.where( cb.equal( customerID, theId ) );
) `: }/ Z: N: V: V% U. }                : N( V! n4 I1 g( Z
解决方案:  M) P4 E6 `# A( v" r2 _. u" C
                / M/ t% x- \% \) L& ]" K4 K& \# F
! w$ q$ y+ A9 h: F& T3 ~+ X

' `% m, U2 E/ J% }1 e! j2 {$ E                CriteriaBuilder cb = this.em.getCriteriaBuilder();& ?: a3 q% d% G$ d6 |
CriteriaQuery c = cb.createQuery(Long.class);//the query returns a long, and not Orders( e0 i1 i1 y! w* Q( ?, n7 ]
Root order = c.from( Order.class );
& Y9 g$ t4 e7 [: ^//c.select(cb.countDistinct(order));//and this is the code you were looking for
0 t6 G! O1 r) e% f7 Z$ B6 Kc.select(cb.countDistinct(order.get("orderID")));//for counting distinct fields other than the primary key
: U2 M% C) d7 @. L* t2 VPath customerID = order.get( "customerID" );7 N' N0 y9 L+ M6 f5 U" ]
c.where( cb.equal( customerID, theId ) );
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则