我使用 JPA + OpenJPA 和 PostgreSQL 作为后端 RDBMS。我的表的主键通常由SERIAL/BIGSERIAL列组成。因此 PostgreSQL 会自动为新条目 ( strategy=GenerationType.IDENTITY)生成 ID 。
ID 属性的注释如下所示:
@Id
@SequenceGenerator(name="myseq",sequenceName="foobartable_fooid_seq")
@GeneratedValue(generator="myseq",strategy=GenerationType.IDENTITY)
Run Code Online (Sandbox Code Playgroud)
我的问题是:我可以将此注释块复制并粘贴到多个实体,同时只修改sequenceName值吗?该sequenceName是从桌到桌不同。但是所有实体的 SequenceGenerator 都可以命名myseq吗?还是必须为每个实体的 SequenceGenerator 指定一个唯一的生成器名称?那么每个 SequenceGenerator 名称在持久化单元中必须是唯一的吗?
使用与数据库中的 sequenceName 相同的值可能是个好主意吗?所以我会写一些类似的东西
@Id
@SequenceGenerator(name="foobartable_fooid_seq",sequenceName="foobartable_fooid_seq")
@GeneratedValue(generator="foobartable_fooid_seq",strategy=GenerationType.IDENTITY)
Run Code Online (Sandbox Code Playgroud)
关于如何命名 SequenceGenerator 的任何建议?
非常感谢您的任何建议!
你的 Snrub 先生
有2个表/实体:AppleTree和Apples.一棵苹果树产生0 ... n个苹果.每个苹果都是第二个表的实体/行,并引用生成它的苹果树(ManyToOne).
我想为最高产的苹果树制作一份"高分"报告.它应按COUNT列按降序排序:
APPLE TREE | COUNT(A)
---------------------
10304 | 1000
72020 | 952
31167 | 800
Run Code Online (Sandbox Code Playgroud)
为了处理这些结果,我创建了一个非实体bean,它结合了AppleTree对象和long值(对于COUNT):
// constructor
public AppleStats (AppleTree at, long howManyApples) { ... }
Run Code Online (Sandbox Code Playgroud)
我想使用JPQL获取此组合类型的行.我的方法基于SELECT NEW语法:
SELECT NEW foo.bar.AppleStats ( a.appleTree, COUNT(a) AS c )
FROM Apples a
GROUP BY a.appleTree
ORDER BY c DESC
Run Code Online (Sandbox Code Playgroud)
不幸的是,它产生了很多错误信息.我认为一个问题是COUNT值的列别名.我使用它,因为我想按这个聚合值排序.这意味着我使用"COUNT(a)AS c"还是"COUNT(a)c"没有区别.它说参数没有用逗号分隔.而且,"表达式无效,这意味着它不遵循JPQL语法".最后它说没有找到与参数类型匹配的构造函数."
有没有办法获得AppleStats结果行?或者我必须回归到本机查询?