我正在用Spring4和Hibernate 5.1编写一个应用程序。我需要能够与使用本地表和列名称保存SQL查询的遗留系统进行互操作。我需要能够将选择对象添加到使用原始列名而不是实体字段名的元组查询中。
我尝试使用Hibernate和Projections.sqlProjection(column_name...这在某种程度上起到了作用,但其他问题阻碍了我继续朝着这个方向前进。
@Transactional(propagation = Propagation.MANDATORY)
public List<Object[]> testQuery() {
Class<?> rootClass = getEntityClassByTable("pm_project");
List<String> columnList = new ArrayList<>();
columnList.add("pm_project.pm_project_id");
columnList.add("pm_project.pm_project_name");
columnList.add("pm_project.pm_project_title");
columnList.add("pm_project.parent_id");
columnList.add("pm_project.pm_project_from_date");
CriteriaQuery<Tuple> query = criteriaBuilder.createTupleQuery();
Root<?> root = query.from(rootClass);
List<Selection> selectionList = new ArrayList<>();
for (String column : columnList) {
Selection s = nativeSelection(column);
selectionList.add(s);
}
query.multiselect(selectionList.toArray());
List<Tuple> resultList = em.createQuery(query).getResultList();
return resultList;
}我需要'NativeSelection',它可以生成本机列名的选择,而不是实体属性名。如果它接受任何可以是字段的sql,那就太好了,因为可能会弹出一些JSON_VALUE字段。
原生sql的值是动态的,我没有收到完整的SQL,只有列和表名,以及可能的JSON_VALUE调用。我非常希望不必生成原生sql,因为我希望在查询中利用其他JPA特性。
发布于 2019-09-26 12:47:07
如果使用原生查询,则不需要指定实体属性名称。您所要做的就是将nativeQuery属性的值设置为true,并在注释的value属性中定义原生SQL查询
@Query(
value = "SELECT * FROM pm_project p WHERE p.pm_project_id= 1",
nativeQuery = true)
Collection<Project> findProjectById();发布于 2019-09-26 13:53:33
您也可以通过简单的JPA在不使用原生查询的情况下执行此操作
List<Project> findAllByProjectId(Integer id);https://stackoverflow.com/questions/58109363
复制相似问题