- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 hibernate jpa 2.1 中发现了一个非常有趣的错误。当我在存储库中编写自定义查询实现并在查询中同时使用自定义 AttributeConverter 和 JOIN 时,AttributeConverter 不起作用。我敢肯定, JOIN 导致了这个问题,但我不知道如何解决。在查询中没有 JOIN AttributeConverter 工作正常。我找到了一个丑陋的解决方案(您可以在我的代码中看到它),但我正在寻找正确的解决方案。
因此,如果使用 JOIN 进行查询
SELECT t FROM TaskEntity t JOIN t.involvedUsers u WHERE status in :statuses AND u.id IN :involvedUserIds ORDER BY t.id DESC
查询参数:
statuses = [CREATED, APPROVED, IN_PROGRESS];
involvedUserIds = [1, 2];
出现以下错误:
2018-02-26 15:39:36.458 DEBUG 2482 --- [nio-8008-exec-1] org.hibernate.SQL : select taskentity0_.id as id1_11_, taskentity0_.amount as amount2_11_, taskentity0_.comment as comment3_11_, taskentity0_.commission as commissi4_11_, taskentity0_.created as created5_11_, taskentity0_.currency as currency6_11_, taskentity0_.current_account_id as current14_11_, taskentity0_.current_object_id as current15_11_, taskentity0_.current_user_id as current16_11_, taskentity0_.description as descript7_11_, taskentity0_.data as data8_11_, taskentity0_.initiator_account_id as initiat17_11_, taskentity0_.initiator_object_id as initiat18_11_, taskentity0_.initiator_user_id as initiat19_11_, taskentity0_.payment_method as payment_9_11_, taskentity0_.status as status10_11_, taskentity0_.title as title11_11_, taskentity0_.updated as updated12_11_, taskentity0_.version as version13_11_ from public.tasks taskentity0_ inner join public.tasks_users involvedus1_ on taskentity0_.id=involvedus1_.task_id inner join public.users userentity2_ on involvedus1_.user_id=userentity2_.id where (status in (? , ? , ?)) and (userentity2_.id in (? , ?)) order by taskentity0_.id DESC limit ?
2018-02-26 15:39:36.459 TRACE 2482 --- [nio-8008-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARBINARY] - [CREATED]
2018-02-26 15:39:36.460 TRACE 2482 --- [nio-8008-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [VARBINARY] - [APPROVED]
2018-02-26 15:39:36.460 TRACE 2482 --- [nio-8008-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [VARBINARY] - [IN_PROGRESS]
2018-02-26 15:39:36.460 TRACE 2482 --- [nio-8008-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as [INTEGER] - [1]
2018-02-26 15:39:36.461 TRACE 2482 --- [nio-8008-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [5] as [INTEGER] - [2]
org.postgresql.util.PSQLException: ERROR: operator does not exist: integer = bytea
No operator matches the given name and argument type(s). You might need to add explicit type casts.
代码如下:
@Repository
public class TaskRepositoryImpl implements CustomTaskRepository {
private final EntityManager em;
@Autowired
public TaskRepositoryImpl(JpaContext context) {
this.em = context.getEntityManagerByManagedType(TaskEntity.class);
}
public List<TaskEntity> find(List<TaskStatuses> statuses, List<Integer> involvedUserIds) {
Map<String, Object> params = new HashMap<>();
StringBuilder queryStr = new StringBuilder("SELECT t FROM TaskEntity t WHERE");
if (statuses != null && !statuses.isEmpty()) {
queryStr.append(" status in :statuses AND");
params.put("statuses", involvedUserIds == null ? statuses :
statuses.stream().map(TaskStatuses::getId).collect(Collectors.toList())); //problem is here
}
if (involvedUserIds != null && !involvedUserIds.isEmpty()) {
queryStr.insert(queryStr.indexOf("WHERE"), "JOIN t.involvedUsers u "); //this join causes the problem
queryStr.append(" u.id IN :involvedUserIds AND");
params.put("involvedUserIds", involvedUserIds);
}
if (queryStr.lastIndexOf(" WHERE") == queryStr.length() - 6)
queryStr.setLength(queryStr.length() - 6);
else
queryStr.setLength(queryStr.length() - 4);
Query query = em.createQuery(queryStr.toString());
params.forEach(query::setParameter);
query.setFirstResult(0);
query.setMaxResults(20);
return query.getResultList();
}
}
任务实体:
@Getter @Setter
@Entity
@Table(name = "tasks")
public class TaskEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String title;
private String description;
@NotNull
@Convert(converter = TaskStatusesConverter.class)
private TaskStatuses status;
@ManyToMany
@JoinTable(
name = "tasks_users",
joinColumns = @JoinColumn(name = "task_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT),
inverseForeignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
private Set<UserEntity> involvedUsers;
}
用户实体
@Getter @Setter
@Entity
@Table(name = "users")
public class UserEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@NotNull
@Column(unique = true)
private String email;
}
任务状态:
public enum TaskStatuses {
CREATED(1),
APPROVED(2),
IN_PROGRESS(3),
COMPLETED(4),
REJECTED(100),
;
private Integer id;
TaskStatuses(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public static TaskStatuses valueOf(Integer id) {
for (TaskStatuses value : values())
if (value.getId().equals(id))
return value;
return null;
}
}
任务状态转换器:
public class TaskStatusesConverter implements AttributeConverter<TaskStatuses, Integer> {
@Override
public Integer convertToDatabaseColumn(TaskStatuses status) {
return status.getId();
}
@Override
public TaskStatuses convertToEntityAttribute(Integer status) {
return TaskStatuses.valueOf(status);
}
}
和存储库:
@NoRepositoryBean
public interface CustomTaskRepository {
List<TaskEntity> find(List<TaskStatuses> statuses, List<Integer> involvedUserIds)
}
在这个项目中,我使用了 spring-boot 1.5.8.RELEASE
和 spring-data-jpa 1.5.8.RELEASE
。项目中的代码经过简化,仅包含此示例所需的信息(您可以在日志中看到一些冗余信息)。谢谢你的帮助。
最佳答案
试试这个:
select t from TaskEntity t where t.status in (:statuses) and t.involvedUsers.id in (:involvedUserIds) order by t.id DESC
关于java - 如果将自定义查询与 JOIN 结合使用,则 Hibernate AttributeConverter 会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48990263/
尝试使用集成到 QTCreator 的表单编辑器,但即使我将插件放入 QtCreator.app/Contents/MacOS/designer 也不会显示。不过,相同的 dylib 文件确实适用于独
在此代码示例中。 “this.method2();”之后会读到什么?在返回returnedValue之前会跳转到method2()吗? public int method1(int returnedV
我的项目有通过gradle配置的依赖项。我想添加以下依赖项: compile group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', v
我将把我们基于 Windows 的客户管理软件移植到基于 Web 的软件。我发现 polymer 可能是一种选择。 但是,对于我们的使用,我们找不到 polymer 组件具有表格 View 、下拉菜单
我的项目文件夹 Project 中有一个文件夹,比如 ED 文件夹,当我在 Eclipse 中指定在哪里查找我写入的文件时 File file = new File("ED/text.txt"); e
这是奇怪的事情,这个有效: $('#box').css({"backgroundPosition": "0px 250px"}); 但这不起作用,它只是不改变位置: $('#box').animate
这个问题在这里已经有了答案: Why does OR 0 round numbers in Javascript? (3 个答案) 关闭 5 年前。 Mozilla JavaScript Guide
这个问题在这里已经有了答案: Is the function strcmpi in the C standard libary of ISO? (3 个答案) 关闭 8 年前。 我有一个问题,为什么
我目前使用的是共享主机方案,我不确定它使用的是哪个版本的 MySQL,但它似乎不支持 DATETIMEOFFSET 类型。 是否存在支持 DATETIMEOFFSET 的 MySQL 版本?或者有计划
研究 Seam 3,我发现 Seam Solder 允许将 @Named 注释应用于包 - 在这种情况下,该包中的所有 bean 都将自动命名,就好像它们符合条件一样@Named 他们自己。我没有看到
我知道 .append 偶尔会增加数组的容量并形成数组的新副本,但 .removeLast 会逆转这种情况并减少容量通过复制到一个新的更小的数组来改变数组? 最佳答案 否(或者至少如果是,则它是一个错
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
noexcept 函数说明符是否旨在 boost 性能,因为生成的对象中可能没有记录异常的代码,因此应尽可能将其添加到函数声明和定义中?我首先想到了可调用对象的包装器,其中 noexcept 可能会产
我正在使用 Angularjs 1.3.7,刚刚发现 Promise.all 在成功响应后不会更新 angularjs View ,而 $q.all 会。由于 Promises 包含在 native
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我正在编写一个玩具(物理)矢量库,并且遇到了 GHC 坚持认为函数应该具有 Integer 的问题。是他们的类型。我希望向量乘以向量以及标量(仅使用 * ),虽然这可以通过仅使用 Vector 来实现
PHP 的 mail() 函数发送邮件正常,但 Swiftmailer 的 Swift_MailTransport 不起作用! 这有效: mail('user@example.com', 'test
我尝试通过 php 脚本转储我的数据,但没有命令行。所以我用 this script 创建了我的 .sql 文件然后我尝试使用我的脚本: $link = mysql_connect($host, $u
使用 python 2.6.4 中的 sqlite3 标准库,以下查询在 sqlite3 命令行上运行良好: select segmentid, node_t, start, number,title
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我是一名优秀的程序员,十分优秀!