TypeORM PostgreSQL select where JSON field equals some value

wixjitnu  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(8)|浏览(346)

**目标:**编写一个select查询,返回state等于“佛罗里达”的所有行。

实体列:

@Column({ type: 'json'})
  public address: Address;

样品列值:

{"city": "miami", "state": "florida"}

示例查询(不起作用):

getManager().getRepository(User)
    .createQueryBuilder('user')
    .select()
    .where('user.address.state =:state', {state: "florida"})

typeorm目前是否支持此功能?如果是这样,我需要如何修改where子句以返回正确的行?

ijnw1ujt

ijnw1ujt1#

另一种可能的解决方案(原始SQL不能用此注入):

.where('user.address ::jsonb @> :address', {
    address: {
        state: query.location
    }
})

这样,TypeORM将生成一个以

WHERE user.address ::jsonb @> $1

并且该查询将被给出,例如,

{ state: 'florida' }

作为查询参数来替换查询中的正确值($1)。
来源:主要是原题+答案(谢谢!)+自己测试+https://www.postgresql.org/docs/9.4/functions-json.html

yhuiod9q

yhuiod9q2#

修好了
正确语法:

.where(`user.address ::jsonb @> \'{"state":"${query.location}"}\'`)
dvtswwa3

dvtswwa33#

它对我有效:

.getRepository(User)
.createQueryBuilder('user')
.where(`user.address->>'state' = :state`, {state: "florida"})
q5lcpyga

q5lcpyga4#

return getRepository(User)
    .createQueryBuilder()
    .where('address @> :address', {
      address: { state: "florida" },
    })
    .getMany();
bxjv4tth

bxjv4tth5#

试试这个:

const users = await getManager()
  .getRepository(UserEntity)
  .createQueryBuilder(`user`)
  .where("address->>'state' = :state")
  .setParameters({ state })
  .getMany();
0h4hbjxa

0h4hbjxa6#

.where(`user.address -> '$.state' = :state`, {state: "florida"})
wpx232ag

wpx232ag7#

.where(“user.address->>'state' =:state”,{state:“佛罗里达).getMany();

kupeojn6

kupeojn68#

这对我很有效我只是使用TypeORM之类的函数。

.find({
   where: {
      address: Like(`%${add what to search for here}%`),
   },
});

相关问题