Read Data
Query Object
To read data from database with rex, a query object need to be created first. Rex generates query object for each model in schema. For example, c.QueryUser()
returns a query object for users table.
- Go
- Java
- TypeScript
userQuery := c.QueryUser()
An alternative query method is provided to support context in go.
userQuery := c.QueryUserContext(ctx)
UserQuery userQuery = c.queryUser();
userQuery = c.queryUser();
Find
Find
method is used to fetch single object from database by primary key, for example:
- Go
- Java
- TypeScript
user, err := c.QueryUser().Find(1);
User user = c.queryUser().find(1);
user = c.queryUser().find(1);
A NotFoundError
is returned if no row is found with the provided primary key.
Find By
- Go
- Java
- TypeScript
user, err := c.QueryUser().FindBy(c.UserID.EQ(1));
User user = c.queryUser().findBy(c.UserID.EQ(1));
user = c.queryUser().findBy(c.UserID.EQ(1));
Find by SQL
- Go
- Java
- TypeScript
users, err := c.QueryUser().FindBySQL("select * from users limit ?", 10)
List<User> users = c.queryUser().findBySQL("select * from users limit ?", 10)
users = c.queryUser().findBySQL("select * from users limit ?", 10);
Select
- Go
- Java
- TypeScript
userQuery = userQuery.Select(c.UserID, c.UserEmail)
Select Distinct
For query with SELECT DISTINCT
- Go
- Java
- TypeScript
userQuery = userQuery.SelectDistinct(c.UserID, c.UserEmail)
userQuery = userQuery.selectDistinct(c.userID, c.userEmail);
Pluck
emails, err := userQuery.Pluck(c.userEmail).AllString()
Where
Rex generates query conditions based on colum types.
EQ
-In
-
userQuery = userQuery.Where(c.UserID.In([]int{1, 2, 3}))
Multiple arguments in Where
will convert into sql AND
,
userQuery = userQuery.Where(
c.UserName.EQ("test"),
c.UserEmail.EQ("test@example.com"),
)
Order
- Go
- Java
- TypeScript
userQuery = userQuery.Order(c.UserCreatedAt.Desc(), c.UserID.Asc())
userQuery = userQuery.order(c.userCreatedAt.Desc(), c.UserID.Asc());
userQuery = userQuery.order(c.userCreatedAt.Desc(), c.UserID.Asc());
Limit and Offset
- Go
- Java
- TypeScript
userQuery = userQuery.Limit(10).Offset(5)
userQuery = userQuery.limit(10).offset(5);
userQuery = userQuery.limit(10).offset(5);
Joins
- Go
- Java
- TypeScript
// Inner join
userQuery.Joins(c.Post)
// SELECT users.* FROM users INNER JOIN posts ON posts.user_id = users.id
userQuery.RawJoins("INNER JOIN posts ON posts.user_id = users.id")
// Multiple joins
userQuery.Joins(c.Post, c.Account)
// Nested joins? posts -> comments
userQuery.Joins(c.Post, c.Comment)
Group and Aggregation
- Go
- Java
- TypeScript
userQuery.Group(c.UserName)
Having
- Go
- Java
- TypeScript
userQuery.Having(c.UserName.EQ())
Query Associations
- Go
- Java
- TypeScript
userQuery, err := userQuery.IncludePosts()
userQuery := userQuery.IncludePosts(func (q *postQuery) {
return q.Limit(3) // first 3 posts for each user
})
Query Methods
A query builder supports several methods based on query purposes.
All
Return all records from query
- Go
- Java
- TypeScript
users, err := userQuery.All()
List<User> users = userQuery.all();
users = userQuery.all();
First
Return the first record from query
- Go
- Java
- TypeScript
users, err := userQuery.First()
User user = userQuery.first();
user = userQuery.first();
Exists
Return whether the query contains any result
- Go
- Java
- TypeScript
exists, err := userQuery.Exists()
boolean exists = userQuery.exists();
exists := userQuery.exists();
Count
Return with COUNT
query
- Go
- Java
- TypeScript
total, err := userQuery.Count()
int total = userQuery.count();
total = userQuery.count();