我正在spring应用程序中使用graphql java工具。我有这样一个实体:
@Entity
data class Image(
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(nullable = false)
val id: Long = 0
) {
@Lob
@Column(nullable = false)
var image: Blob? = null
}
在GraphQL模式中,我想要一个不同的类型:
type Image {
id: ID!
image: String!
}
当然,由于模式解析异常,启动此操作将不起作用。所以我认为在模式解析之间放置一些东西来实现从Blob
到String
的映射是可能的。
这有可能吗?
@Bean
fun schemaParserDictionary(): SchemaParserDictionary {
return SchemaParserDictionary()
}
编辑
抱歉,它不会给出架构解析异常。它将简单地将字节放入字符串中。但是我不能用这个字符串来创建图像。
澄清
对不起,我想我的问题还不够清楚。我不需要知道如何将blob转换为字符串。有非常简单的解决方案。例如,我可以使用一个简单的API函数将字节码转换为base64:
val base64 = Base64.getEncoder().encodeToString(byteCode)
我试图问的是如何“告诉”graphql模式解析器对特定字段使用“自定义”转换。因此,当我的实体对象具有数据类型为blob的字段image
时,graphql会自动将其转换为字符串。但是字符串不包含我需要的内容。所以我想为这个特定的字段使用一个自定义的解析/映射/转换/任何东西。当然,我也可以通过引入另一个我没有存储在数据库中的字段来轻松解决这个问题:
@Entity
data class Image(
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(nullable = false)
val id: Long = 0
) {
@Lob
@Column(nullable = false)
var image: Blob? = null
@Transient
var base64: String = ""
}
但我通过graphql api使其可查询:
type Image {
id: ID!
image: String!
base64: String!
}
type Images {
images: [Image!]!
totalCount: Int!
}
type Query {
getImages: Images!
}
并将其设置在我的控制器中:
private fun getImages(): Images {
var images: List<Image> = repository.findTop1000()
images.forEach {
it.base64 = Base64.getEncoder().encodeToString(it.image)
queue.offer(it)
}
}
但是如果我能告诉graphql模式解析器这样做,它会更干净。
为什么不使用自定义标量?它直接回答了您的起始问题:
所以我认为在模式解析之间加入一些东西是可能的,以实现从Blob到字符串的映射。
这有可能吗?
您的GraphQL模式将是:
scalar ImageBlob
type Image {
id: ID!
image: ImageBlob!
}
然后,在自定义标量实现中,提供Blob从和到字符串的转换。
让我们从头开始检查。我们知道BLOB是用于存储字节的二进制大对象的首字母缩写
但是,如果您想将BLOB转换为字符串,您可以尝试以下代码:
String s = "";
InputStream inStream = b.getBinaryStream();
//b is your BLOB
InputStreamReader inStreamReader = new InputStreamReader(inStream);
BufferedReader reader = new BufferedReader(inStreamReader );
StringBuffer buf = new StringBuffer();
while(s = reader.readLine())
{
buf.append(s);
}
您还可以采取多种方法,其中之一是
ByteArrayOutputStream baos = new ByteAttayOutputStream();
byte[] buf = new byte[1024];
InputStream in = blob.getBinaryStream();
int n = 0;
while ((n=in.read(buf))>=0)
{
baos.write(buf, 0, n);
}
in.close();
byte[] bytes = baos.toByteArray();
String blobString = new String(bytes);
如果你方有任何进一步的疑问,我将不胜感激。
Kushal的回答提供了将Blob转换为字符串的代码段。要使用这种转换,最好使用DTO。
要做到这一点,请将您的graql模式转换为:
type ImageDTO {
id: ID!
image: String!
}
并创建一个DTO类ImageDTO:
public class ImageDTO {
private Image entity;
//Constructor
public ImageDTO(Image image) {
this.entity=image;
}
//Getters
public Long getId() {
return entity.getId();
}
public String getImage() {
//convert the entity image and return it as String
return Base64.getEncoder().encodeToString(entity.getImage());
}
}
将DTO与实体分离,可以更好地控制传输的数据。
问题内容: 背景 将列数据类型映射到其对应的Java类。 问题 查询从数据库返回元信息: 例如,此查询返回(自引用): 其中“ dictionary”是架构名称,“ resource_bundle”是object_name,“ column_name”是column_name。 要做类似的事情会很棒: 并返回以下查询: 然后使用JDBC发现已映射到。 问题 在PostgreSQL中,如何给定架构名
类型映射 web3j中使用的原生Java到ABI类型映射如下: boolean -> bool BigInteger -> uint/int byte[] -> bytes String -> string and address types List<> -> dynamic/static array BigInteger类型必须用于数字类型,因为Ethereum以太坊中的数字类型是256位整数
问题内容: 我正在寻找一个表的链接,该表包含SQL类型(java.sql.Types)与Java类型之间的映射。 你知道我在哪里可以找到吗? 问题答案: 该 JDBC 4.x的规范 ,通过提供JSR 221 ,提供在标题为附录B中该信息 数据类型转换表 。 请参阅包含从Java对象类型到JDBC类型的映射的表。当调用JDBC API的不同方法时,将有不同的表用于映射。例如,在方法期间使用的映射存在
我有一个实体Person,它由name属性组成 我不想在一个额外的表中存储“name”...我将name标记为transient,这样它就不会存储在基础数据库中。 我想要的是将属性“name”映射到数据库中的列“first_name”和“last_name”。 例如,我可以像那样创建一个人 如何实现映射,使基础表包含两个附加列first_name和last_name,内容是从name属性获得的字符
给定一组C++概念: 但是样板文件穿过屋顶:)
问题内容: 我的PostgreSQL数据库(9.2)中有一个表,其中的列类型为JSON。我很难将此列映射到“ JPA2实体”字段类型。 我尝试使用String,但是当我保存实体时,出现一个异常,即它无法将字符转换为JSON。 处理JSON列时使用的正确值类型是什么? 一个简单的解决方法是定义一个文本列。 问题答案: 请参阅PgJDBC错误#265。 PostgreSQL过于严格,对数据类型转换非常