当前位置: 首页 > 知识库问答 >
问题:

带有@CONVERT的JPQL IN子句

陈德泽
2023-03-14
--------------------------------------
| id (VARCHAR) | recordIds (VARCHAR) |
--------------------------------------
| 1            | 3,1                 |
| 2            | 2                   |
--------------------------------------

记录具有id和名称

---------------------------------
| id (VARCHAR) | name (VARCHAR) |
---------------------------------
| 1            | X              |
| 2            | Y              |
| 3            | Z              |
---------------------------------

带有@Convert的DocumentModel

@Entity
@Table(name = "Document")
public class DocumentModel {
    @Id
    @Column(name = "id")
    private String id;

    @Column(name = "recodeIds")
    @Convert(converter = RecordsConverter.class)
    private Set<String> records;
}

记录转换器

public class RecordsConverter implements AttributeConverter<Set<String>, String> {
    @Override
    public String convertToDatabaseColumn(Set<String> recordTypes) {
        return String.join(",", recordTypes);
    }
    @Override
    public Set<String> convertToEntityAttribute(String recordTypes) {
        return Arrays.stream(recordTypes.split(",")).collect(Collectors.toSet());
    }
}
@Query("SELECT D.id, R.name)"
    + " FROM DocumentModel D"
    + " JOIN RecordModel R"
    + " ON R.id IN D.records"
    + " WHERE D.id = :docId"

如果recordIds有多个值(例如:docId=1),即使:

  • 嵌套选择不工作
  • IN子句有和没有()不工作
  • 子句的成员不工作
  • 导致本机SQL直接无法工作
  • @公式不工作

而且问题似乎是记录应该是单引号-逗号分隔的,而不仅仅是逗号分隔的,因为它们是字符串。(本机SQL查询在这种情况下工作)

共有1个答案

蒋默
2023-03-14

好像我被冬眠虫感染了

作为一种变通方法,请使用集合包装:

@Data
@Builder
public class MyCollection implements Serializable {
    private final Set<String> collection;
}

并更改属性转换器:

public class MyConverter implements AttributeConverter<MyCollection, String> {
    @Override
    public String convertToDatabaseColumn(MyCollection myCollection) {
        return String.join(",", myCollection.getCollection());
    }
    @Override
    public MyCollection convertToEntityAttribute(String myCollection) {
        return MyCollection.builder()
                .collection(Arrays.stream(myCollection.split(",")).collect(Collectors.toSet()))
                .build();
    }
}
@Entity
@Table(name = "MY_MODEL")
public class MyModel {
    @Column(name = "MY_COLLECTION")
    @Convert(converter = MyConverter.class)
    private MyCollection myCollection;
}
 类似资料:
  • 描述 (Description) 数字从一个单位转换为另一个单位。 它包含两个论点; 第一个参数传递数字和单位,第二个参数包含单位。 当设备兼容时,将转换该数字。 如果第一个参数未更改,则单元不兼容。 例子 (Example) 以下是使用扩展名.less保存的样式表文件; 这类似于CSS文件。 style.less body { meter:convert(10cm, mm); tim

  • 例如,我想做这样的事情: 新建Select().from(Table).where(“id in?”,list).execute()

  • Update:这里是带有共享状态示例的CodeSandBox.io链接,它使用类组件,我希望在不复制状态或使用虚假状态更新的情况下将这些组件转换为钩子。

  • 问题内容: 我正在使用UNION创建一个搜索界面来搜索多个表。我的问题是,当我尝试搜索单词时,最后一个表中的数据是唯一不断出现的东西。如何在条件适当的地方正确搜索表,应根据其首字母搜索名称。 这是我的代码: 问题答案: 未使用的参数的值为NULL。只有表实际进行搜索。 您必须为查询提供六个参数: 或在所有LIKE中使用相同的参数:

  • 本文向大家介绍Python带有“ else”子句的循环,包括了Python带有“ else”子句的循环的使用技巧和注意事项,需要的朋友参考一下 示例 的for和while复合语句(环路)可以可选地具有一个else条款(在实践中,这种用法是相当罕见的)。 该else子句仅在for循环通过迭代终止而终止之后执行,或者在while循环的条件表达式变为false终止之后才执行。 输出: 该else条款并没

  • Convert 是一个比较独立的组件,仅依赖于util包。提供Java对象的序列化与反序列化功能。支持JSON(JavaScript Object Notation)、BSON(Binary Stream Object Notation)两种格式化。 两种格式使用方式完全一样,其性能都大幅度超过其他JSON框架。同时JSON内置于HTTP服务中,BSON也是SNCP协议数据序列化的基础。 Conv