【发布时间】:2021-10-12 21:53:10
【问题描述】:
我想编写一个本地查询“从表中选择 *”我的存储库。表名与实体名不同。
运行查询时,
1 如果我把它返回的实体名称表未找到。
2 如果我将表名放入查询中,我会得到 Validation failed for query。
查询是
@Transactional
@Query(
value = "Select * from " +
"TariffPacks r2 where r2.TariffID = :tariffId " +
"and r2.regionname = :regionname " +
"and r2.category = :category " +
"and r2.amount = :amount " +
"and r2.operator = :operator", nativeQuery = true
)
List<TariffPacks> findByTariffID_RegionName_Category_Amount_Operator(
@Param("tariffId") Long tariffId,
@Param("regionname") String regionname,
@Param("category") String category,
@Param("amount") Integer amount,
@Param("operator") String operator
);
@Transactional
@Modifying
@Query(
value = "Delete from " +
"TariffPacks r2 where r2.TariffID = :tariffId " +
"and r2.regionname = :regionname " +
"and r2.category = :category " +
"and r2.amount = :amount " +
"and r2.operator = :operator"
)
List<TariffPacks> deleteByTariffID_RegionName_Category_Amount_Operator(
@Param("tariffId") Long tariffId,
@Param("regionname") String regionname,
@Param("category") String category,
@Param("amount") Integer amount,
@Param("operator") String operator
);
如果我使用“Select * from TariffPacks r2 ..., nativeQuery = true”,我会收到错误 Tariffpacks 不存在。 如果我使用“Select * from RECHARGEDATAPACKS r2 .., nativeQuery = true”,我会在 Hibernate 中收到验证错误。
实体:
import lombok.*;
import javax.persistence.*;
import java.time.LocalDateTime;
@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "RECHARGEDATAPACKS")
public class TariffPacks {
@Id
@GeneratedValue(generator = "RECHARGEDATAPACKS_SEQ")
@SequenceGenerator(name = "RECHARGEDATAPACKS_SEQ", sequenceName = "RECHARGEDATAPACKS_SEQ", allocationSize = 1)
// @GeneratedValue(strategy = GenerationType.AUTO)
private Long packid;
private Long TariffID;
private String operator;
private String operatoralias;
private String regionname;
private String regionalias;
private String category;
private Integer amount;
private String talktime;
private String validity;
private String description;
private String billercategory;
private String updatedOn;
private String entryDate;
}
我有三个问题: 1 如何在使用nativeQuery = true时让hibernate查找表名(RECHARGEDATAPACKS)?
2 我可以在不使用 nativeQuery = true 的情况下在 Hibernate 中编写“Select *”吗?我想我必须写下所有列名,如 TariffId、Operator、region ..,但我希望返回实体。如何将所有列映射到输出中的实体?
3 有没有其他方法可以编写单个列名并将它们映射到实体类?比如我写了 Select TariffId, Operator, region ..,我怎么能直接获取关税ID?
【问题讨论】:
-
您必须使用表名。验证错误是什么样子的?
-
它现在可以使用表名而不是实体名,不知道为什么它一直抛出错误。
-
你的问题回答了吗?
-
是的,但其他问题仍然存在。
-
@SimonMartinelli 我间歇性遇到的休眠错误是: 引起:java.lang.IllegalStateException:org.hibernate.hql.internal.QueryExecutionRequestException:不支持 DML 操作 [从 com.telecomwatch 删除.process.entity.TariffPacks r2 where r2.TariffID = :tariffId and r2.regionname = :regionname and r2.category = :category and r2.amount = :amount and r2.operator = :operator] at org.hibernate.query。 internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1607) at org.hibernate.query.Query.getResultList(Query.java:165)
标签: oracle spring-boot hibernate java-8