我有一个模拟所有类别的类,它们可以按层次排序.
@Entity
@Table(name="categories")
public class Category {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequence")
@SequenceGenerator(name="sequence", sequenceName="categories_pk_seq", allocationSize=1)
@Column(name="id")
private Long id;
@Column
private String name;
@OneToOne
@JoinColumn(name="idfather")
private Category father;
}
Run Code Online (Sandbox Code Playgroud)
我需要按层次顺序排列所有类别(我的意思是每个父亲后跟其子级和父级按字母顺序在每个级别上排序),因为它们可以在例如Oracle中的PRIOR中制作.是否可以使用JPA查询(而不是SQL查询)执行此操作?
谢谢.
我放弃并问社区......
在我的项目中,我使用的是Hibernate 3.6.4.Final和自定义sql方言:
public class ServiceAppMySQL5InnoDBDialect extends MySQL5InnoDBDialect {
public ServiceAppMySQL5InnoDBDialect() {
super();
registerFunction("bitwise_and", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "(?1 & ?2)"));
registerFunction("hasflags", new SQLFunctionTemplate(StandardBasicTypes.BOOLEAN, "?1 & ?2 = ?2"));
}
}
Run Code Online (Sandbox Code Playgroud)
hasflags在HQL查询中使用该方法失败.这是查询:
Query q = em
.createQuery(
"SELECT o FROM "
+ entityClass.getName()
+ " o WHERE hasflags(o.status, :status) AND o.email = :email")
.setParameter("email", username)
.setParameter("status", status.getBitmask());
Run Code Online (Sandbox Code Playgroud)
错误:
Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: ( near line 1, column 50 [SELECT o FROM tv.px.domain.Owner o WHERE hasflags(o.status, :status) AND o.email = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 jpql 和 JPA 来获取配置文件的配置文件菜单。我的“个人资料”和“个人资料菜单”实体具有多对一的关系。
我尝试过研究这些答案,但找不到任何可行的解决方案。
如何在Spring Boot应用程序中添加非标准化sql函数?
https://vladmihalcea.com/hibernate-sql-function-jpql-criteria-api-query/
我也浏览了这个链接,似乎和我有同样的问题, How to register non-standardized SQL function Manual in Spring Boot application?
使用本机查询时,我可以使用以下查询获取数据:
SELECT
GROUP_CONCAT(pm.user_menu_id SEPARATOR ',')
AS profile_menu_ids,
p.description
FROM profile p
LEFT JOIN profile_menu pm ON p.id = pm.profile_id
WHERE
p.id =:profileId
AND
pm.status = 'Y'
GROUP BY p.id
Run Code Online (Sandbox Code Playgroud)
上述查询为我提供的数据为,
| 个人资料菜单 ID | 描述 |
|---|---|
| 4,5 | 管理员简介 |
jpql 和 JPA 中是否有任何方法或替代方案来获得上述结果?
我在当前的 spring-boot 项目中使用 JPA 查询。如何添加非标准化 SQL 函数,如GROUP_CONCAT?
之前,我以前的问题: 如何在 JPA 查询中的一行逗号分隔列表中显示列结果
我发现 GROUP_CONCAT 不是 JPA 查询中的注册函数,但可以通过手动注册来访问它。我已经尝试过以下链接,但对我不起作用:
如何在 Spring Boot 应用程序中添加非标准化的 sql 函数?
https://thoughts-on-java.org/database-functions/
https://vladmihalcea.com/hibernate-sql-function-jpql-criteria-api-query/
1.
public class SqlFunctionsMetadataBuilderContributor
implements MetadataBuilderContributor {
@Override
public void contribute(MetadataBuilder metadataBuilder) {
metadataBuilder.applySqlFunction(
"group_concat",
new StandardSQLFunction(
"group_concat",
StandardBasicTypes.STRING
)
);
}
}
Run Code Online (Sandbox Code Playgroud)
2.
public String render(Type firstArgumentType, List arguments, SessionFactoryImplementor factory)
throws QueryException {
if (arguments.size() < 1) {
throw new QueryException(new IllegalArgumentException("group_concat should have at …Run Code Online (Sandbox Code Playgroud) java ×3
jpa ×3
hibernate ×2
jpql ×2
mysql ×2
dialect ×1
hql ×1
persistence ×1
spring ×1
spring-boot ×1