我有一个@NamedQuery
这样的
select i from MyTable i
where
(i.streetId = :streetId and i.cityId = :cityId)
or
(i.streetId is null and i.cityId = :cityId)
or
(i.streetId = :streetId and i.cityId is null)
Run Code Online (Sandbox Code Playgroud)
不知何故,Hibernate 将括号重新排列为
Hibernate:
select
mytable0_.id as id1_14_,
mytable0_.version as version2_14_,
mytable0_.streetId as streetI3_14_,
mytable0_.cityId as cityId7_14_
from
myTable mytable0_
where
mytable0_.streetId=?
and mytable0_.cityId=?
or (
mytable0_.streetId is null
)
and mytable0_.cityId=?
or mytable0_.streetId=?
and (
mytable0_.cityId is null
)
Run Code Online (Sandbox Code Playgroud)
为什么要这样做?(它们可能是等价的,但我更喜欢更简单的 where 子句)
当前的解决方法是用本机 SQL 编写它,但我只是想知道这是否是一个已知问题。
我有一个带有注释的控制器 @RestController
,它实现了一个接口:
public interface ContratEndpoint {
String ROOT = "/api/contrats";
String GET_CONTRAT = "";
String GET_CONTRAT_PER_PK = "/{idContrat}";
@RequestMapping(value = GET_CONTRAT)
Contrat getContrat(@RequestParam(value = "contratId")Long contratId);
@RequestMapping(value = GET_CONTRAT_PER_ID)
ExtContrat getContratById(@PathVariable("idContrat") Long idContrat);
}
Run Code Online (Sandbox Code Playgroud)
控制器:
@RestController
@RequestMapping(value = ContratEndpoint.ROOT)
public class ContratController implements ContratEndpoint {
//Injecting Services....
@Resource
private Mapper mapper;
@Override
public Contrat getContrat(Long contratId) {
return mapper.map(contratService.get(contratId),Contrat.class);
}
@Override
public ExtContrat getContratById(@PathVariable("idContrat") Long idContrat){
Preconditions.checkArgument(idContrat !=null);
return mapper.map(contratService.get(idContrat),ExtContrat.class);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常。
。但是,对于第一个继承的方法,我不必使用注释参数,@RequestParam
并且效果很好。
至于我最初尝试的第二种方法:
@Override
public ExtContrat …
Run Code Online (Sandbox Code Playgroud) 我有一个要维护的项目,该项目的持久性层使用JPA
,Hibernate
并且它在MySQL
服务器上运行,数据库不在数据库中 relational
,并且引擎MyISAM
在所有表上。
我有一些外键关系hps映射为@ManyToOne
我实体上的关系。
现在的问题是,这些列中的某些列应该是foreignkeys
为了正确映射而创建的,但它们不是(因为引擎是MyISAM
,并且DB
仅relational
是理论上的),因此其中一些列具有错误的值,例如(负数) -1,0,不存在的已故父母)。
@Entity
public class EntityA {
@ManyToOne
@JoinColumn(name="COL_FK")
private EntityB b;
}
Run Code Online (Sandbox Code Playgroud)
在数据库中,可能的值为COL_FK
:0,-1,DEAD PARENTS
我既不能更改数据库结构,也不能编辑列中的数据。我所能做的就是更改代码。
我怎么能告诉Hibernate忽略那些值,而不会RuntimeException
仅仅因为它的一个元素包含了一个错误的foreingkey
值就抛出一个列表。
谢谢。
更新:
@Embeddable
public class EntityA {
@ManyToOne()
@JoinColumn(name = "idClient")
@NotFound(action = NotFoundAction.IGNORE)
private ClientBO idClient;
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪 :
AVERTISSEMENT: org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find xx.xxx.xx.xxx.ClientBO with id 210; nested exception is …
Run Code Online (Sandbox Code Playgroud)