-
-
Notifications
You must be signed in to change notification settings - Fork 6.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
TypeOrm 3: search is broken in array of enums (postgres) #8765
Comments
Variations of OR syntax where: [{ adminRoles: AdminRole.ADMIN }], where: { adminRoles: `{${adminRoles.join(",")}}` }, does not work |
what about where: {
adminRoles: In(AdminRole.ADMIN),
}, |
your option throws type error
|
Query builder works but there are another 3 issues
public async autocomplete(dto: IAdminAutocompleteDto): Promise<Array<AdminEntity>> {
const { adminRoles } = dto;
const queryBuilder = this.adminEntityRepository.createQueryBuilder("admin");
// queryBuilder.select(["id", "display_name"]); // <-- this line
if (adminRoles) {
if (adminRoles.length === 1) {
queryBuilder.andWhere(":adminRoles = ANY(admin.adminRoles)", { adminRoles: adminRoles[0] });
} else {
queryBuilder.andWhere("admin.adminRoles && :adminRoles", { adminRoles });
}
}
return queryBuilder.getMany();
} |
Can you also try: where: {
adminRoles: Equal([AdminRole.ADMIN]),
}, |
this also gives type error
|
@pleerock should I split this issue into two? enums and select? |
Not really sure how it worked before, but the way you can use it now is to use new operators I added in #8766 |
will check and report back to you |
@pleerock, new operators works, thanks public async autocomplete(dto: IAdminAutocompleteDto): Promise<Array<AdminEntity>> {
const { adminRoles = [] } = dto;
return this.adminEntityRepository.find({
where: {
adminRoles: ArrayOverlap(adminRoles),
},
select: ["id", "displayName"],
});
} however, there is still a broken SELECT function in the query builder
public async autocomplete(dto: IAdminAutocompleteDto): Promise<Array<AdminEntity>> {
const { adminRoles = [] } = dto;
const queryBuilder = this.adminEntityRepository.createQueryBuilder("admin");
queryBuilder.select(["adminRoles"]);
if (adminRoles) {
if (adminRoles.length === 1) {
queryBuilder.andWhere(":adminRoles = ANY(admin.adminRoles)", { adminRoles: adminRoles[0] });
} else {
queryBuilder.andWhere("admin.adminRoles && :adminRoles", { adminRoles });
}
}
return queryBuilder.getMany();
} produces SQL
public async autocomplete(dto: IAdminAutocompleteDto): Promise<Array<AdminEntity>> {
const { adminRoles = [] } = dto;
const queryBuilder = this.adminEntityRepository.createQueryBuilder("admin");
queryBuilder.select(["id", "admin_roles"]);
// queryBuilder.select(["id"]);
if (adminRoles) {
if (adminRoles.length === 1) {
queryBuilder.andWhere(":adminRoles = ANY(admin.adminRoles)", { adminRoles: adminRoles[0] });
} else {
queryBuilder.andWhere("admin.adminRoles && :adminRoles", { adminRoles });
}
}
return queryBuilder.getMany();
} produces SQL
public async autocomplete(dto: IAdminAutocompleteDto): Promise<Array<AdminEntity>> {
const { adminRoles = [] } = dto;
const queryBuilder = this.adminEntityRepository.createQueryBuilder("admin");
queryBuilder.select(["id", "admin_roles"]);
if (adminRoles) {
if (adminRoles.length === 1) {
queryBuilder.andWhere(":adminRoles = ANY(admin.adminRoles)", { adminRoles: adminRoles[0] });
} else {
queryBuilder.andWhere("admin.adminRoles && :adminRoles", { adminRoles: ArrayOverlap(adminRoles) });
}
}
return queryBuilder.getMany();
} throws error
public async autocomplete(dto: IAdminAutocompleteDto): Promise<Array<AdminEntity>> {
const { adminRoles = [] } = dto;
const queryBuilder = this.adminEntityRepository.createQueryBuilder("admin");
queryBuilder.select(["id", "admin_roles"]);
if (adminRoles) {
if (adminRoles.length === 1) {
queryBuilder.andWhere(":adminRoles = ANY(admin.adminRoles)", { adminRoles: adminRoles[0] });
} else {
queryBuilder.andWhere("admin.adminRoles && :adminRoles", { adminRoles });
}
}
return queryBuilder.getMany();
} produces SQL
public async autocomplete(dto: IAdminAutocompleteDto): Promise<Array<AdminEntity>> {
const { adminRoles = [] } = dto;
const queryBuilder = this.adminEntityRepository.createQueryBuilder("admin");
queryBuilder.select({
id: true
});
if (adminRoles) {
if (adminRoles.length === 1) {
queryBuilder.andWhere(":adminRoles = ANY(admin.adminRoles)", { adminRoles: adminRoles[0] });
} else {
queryBuilder.andWhere("admin.adminRoles && :adminRoles", { adminRoles });
}
}
return queryBuilder.getMany();
} throws type error
|
you don't use const queryBuilder = this.adminEntityRepository.createQueryBuilder("admin");
queryBuilder.select(["admin.id", "admin.admin_roles"]); |
ok, this approach works queryBuilder.select(["admin.adminRoles"]);
and this does not queryBuilder.select(["admin.admin_roles"]);
I mean query is correct but it seems the result is not mapped to entity because of the difference in fields name is this correct behavior? PS |
are you talking about alias name? alias name can be any. you don't have entity mapped because you did not select primary columns, they are required for selection if you want entities to be properly mapped and returned |
thanks. this works |
I'm having a similar issue described here => https://stackoverflow.com/questions/78511788/typeorm-findoptionswhere-throws-incompatible-error-on-enums-array I'm using version |
Issue Description
Search by array property is broken
Expected Behavior
Same behavior as in v2
Actual Behavior
throws type error
Steps to Reproduce
v2 worked fine
v3 shows type error
I tried to fix with
but it throws Postgres error
Have no idea how to fix this, please help
My Environment
Additional Context
Relevant Database Driver(s)
aurora-mysql
aurora-postgres
better-sqlite3
cockroachdb
cordova
expo
mongodb
mysql
nativescript
oracle
postgres
react-native
sap
sqlite
sqlite-abstract
sqljs
sqlserver
Are you willing to resolve this issue by submitting a Pull Request?
The text was updated successfully, but these errors were encountered: