回答

收藏

JPQL中的FROM子句为空?

技术问答 技术问答 257 人阅读 | 0 人回复 | 2023-09-13

我正在使用JPQL选择来访问Oracle DB函数: select FUNCTION('function_name', 'foo', 1234) from: }, e* y) Q4 Q! U. ^9 R: E
com_mycompany_bar obj
4 |& C- s6 M- x; F. X" k3 v# m! b) x1 n这按预期工作,并且确实调用了该函数。问题是我实际上不需要该FROM子句,而是希望将其为空,而不是仅为了遵守语法而访问一个实体。6 `0 e% b- n: i; S; p
我在这里最好的选择是什么?
# n2 X) R  C  E) _! q+ B                5 T2 z5 ^6 P# T; e( E; W# C
解决方案:- u+ ]# e8 a/ _; K
                5 ^9 u& u) g/ Y* g
. i$ `, g6 o9 d& d$ _
8 \8 G" U' Z) R. x% z: q# X# F. q. v
                我看到几个可能的答案:
* U! l+ V, m/ d4 o  V! z- E+ ]在标准JPA中,有两个选择,都涉及Oracle DUAL“表”
1 {1 f  A: ~+ L! N3 c  }6 n[ol]映射DUAL到实体并在FROM子句中使用它。这是更“ JPQL”的方式,但涉及更多:
3 e' F* j2 Z, M% ~& M) C% k[/ol]
) y6 d% y7 E' Q0 x在Java代码中:6 C  {) G1 L; L. H' T% u
@Entity(name = "Dual")
$ ^( _2 g# Z$ j9 O0 U@Table(name = "SYS.DUAL")
) n' U, K7 I4 t( {+ \public class Dual {
* o2 H  W; l9 j+ n* n    @Id7 x/ J/ L; n9 W" O4 Y) v& y" V' A
    @Column(name = "DUMMY")) E9 q+ ?+ l. Q7 m
    private String dummy;
' d' u8 B6 F; I) M}
  L3 F) P- i+ q& N9 U4 N0 B在orm.xml中:* f9 c' s0 c! z* @, k
6 Q3 L; F/ w8 X9 g6 x( b8 ]' \
   
/ f* n' k  j* l9 h   
/ J5 ~' w. v# V1 ?) G% g- _# E, l, \* e0 @4 ~
在客户端代码中:
% z% z  `5 `: r* `* h9 e. f9 GQuery q = entityManager.createNamedQuery("yourQuery");
+ W6 U! T+ E% E/ c, Z[ol]只需使用使用 DUAL) W! r- j# ?& C
[/ol]
$ U4 D3 Y  u* {. q: C4 B% u. z在orm.xml中:$ }6 H' e) X7 q+ B/ h3 m

% `* @) f+ V: x- }# |# G   
* [% @; Y- y) o* R; E4 z! v% _   
6 |) Y5 \6 v, U) y6 O5 L' }% k/ v; N( U2 D  x5 V
在客户端代码中:
0 V5 n3 s: R  |Query q = entityManager.createNativeQuery("yourQuery");9 |/ o$ s( z* V9 @2 U% H4 j0 r
作为最后的选择,您可以对JPA使用一些JPA实现扩展,并避免DUAL:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则