我在使用 JPA 构建工作复杂 CriteriaQuery(包括两个子查询)时遇到问题。
在 SQL 中,查询将如下所示:
SELECT * FROM photos p WHERE ((p.userID = 1) AND ((p.privacy = 0)
OR (p.privacy = 1 AND EXISTS (SELECT * FROM friendships fs WHERE ((fs.userID = p.userID AND fs.userID2 = 2) OR (fs.userID = 2 AND fs.userID2 = p.userID))))
OR (p.privacy = 2 AND EXISTS (SELECT * FROM photo_privacy_users ppu WHERE (ppu.photoID = p.photoID AND ppu.userID = 2)))
));
Run Code Online (Sandbox Code Playgroud)
澄清sql查询:
photos.privacy = 0表示PrivacyType.PUBLIC
photos.privacy = 1表示PrivacyType.PRIVATE
photos.privacy = 2表示PrivacyType.COSTUM
目前我收到以下错误:
org.hibernate.engine.jdbc.spi.SqlExceptionHelper - …
首先介绍一下背景。
我在 Visual Studio 2017 社区中使用 .Net Framework 4.6.1、Microsoft.AspNet.WebApi 5.2.4。
我的 ApiController 的实现端点会抛出预期的异常,例如,如果未满足某些要求。我添加了全局 ExceptionFilterAttribute 和 ExceptionHandler 来处理这些异常并返回正确的响应。异常是继承自 System.Exception 的类型。
这只是偶尔按预期工作。每隔第二个或第三个或有时第五个(没有真正的模式)请求,api 服务器根本不返回任何响应,例如邮递员说:“无法得到任何响应”。
为了测试这一点,我使用了具有相同输入的相同端点。
为了更好地了解该问题,我做了以下一些事情:
我向 Global.asax 添加了异常日志记录(以捕获第一次机会异常)
我订阅了 Global.asax Application_Error 事件
我查看了 IIS 日志
这些都没有让我更接近这个问题。像预期的那样捕获并记录了 Global.asax 异常,但没有其他错误或异常可以为我的问题提供更多信息。
这是我的代码:
我简化了 ApiController 的功能并删除了业务逻辑。
[Route("test")]
[HttpGet]
public IHttpActionResult GetTest()
{
throw new ObjectAlreadyExistsException("test");
return ResponseFactory.CreateOkResponse(null);
}
public class ExceptionFilter : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
if (context.Exception is ObjectAlreadyExistsException)
{
context.Response = ResponseFactory.CreateErrorResponseMessage(context.Exception.Message, new Error("OBJECT_ALREADY_EXISTS_ERROR", context.Exception.Message));
}
else if (context.Exception is …Run Code Online (Sandbox Code Playgroud)