Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeORM PostgreSQL select where JSON field equals some value

Goal: write a select query that returns all rows where state equals "florida".

Entity column:

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

Sample column value:

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

Example query (doesn't work):

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

Is this functionality currently supported in typeorm? If so, how would I need to modify my where clause to return the correct rows?

like image 232
user2263572 Avatar asked Oct 15 '18 00:10

user2263572


2 Answers

Another possible solution (raw SQL can not be injected with this):

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

With this, TypeORM will produce an SQL query ending with

WHERE user.address ::jsonb @> $1

and the query will be given e.g.

{ state: 'florida' }

as a query parameter to replace the right value ($1) in the query.

Sources: Mainly the original question + answer (thank you!) + own testing + https://www.postgresql.org/docs/9.4/functions-json.html

like image 192
Henri Kellock Avatar answered Sep 17 '22 09:09

Henri Kellock


It works for me:

.getRepository(User)
.createQueryBuilder('user')
.where(`user.address->>'state' = :state`, {state: "florida"})
like image 24
Jose Luis Cueva Tacuri Avatar answered Sep 18 '22 09:09

Jose Luis Cueva Tacuri