Examples

This page provides real-world examples and use cases for PojoQuery.

Blog System

Article Management

A blog system with articles, authors, comments, and categories:

@Table("article")
public class Article {
    @Id
    Long id;
    String title;
    String content;
    Date publishDate;
    String status;

    @Link
    User author;

    @Link
    Category category;
}

@Table("user")
public class User {
    @Id
    Long id;
    String firstName;
    String lastName;
    String email;
    String role;
}

@Table("category")
public class Category {
    @Id
    Long id;
    String name;
    String description;
}

@Table("comment")
public class Comment {
    @Id
    Long id;
    String content;
    Date submitDate;

    @Link
    User author;

    @Link
    Article article;
}

// Article detail view with comments
class ArticleDetail extends Article {
    @Link
    List<Comment> comments;
}

// Article list view with author
class ArticleListView extends Article {
    @Select("COUNT(DISTINCT comment.id)")
    Integer commentCount;

    @Select("MAX(comment.submitDate)")
    Date lastCommentDate;
}

// Usage examples
public class ArticleService {
    private final DataSource dataSource;

    public ArticleService(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    // Get article with comments
    public ArticleDetail getArticle(Long articleId) {
        return PojoQuery.build(ArticleDetail.class)
            .addWhere("article.id=?", articleId)
            .addOrderBy("comments.submitDate")
            .execute(dataSource)
            .get(0);
    }

    // Get articles by category
    public List<ArticleListView> getArticlesByCategory(Long categoryId) {
        return PojoQuery.build(ArticleListView.class)
            .addJoin(JoinType.LEFT, "comment", "comment",
                "article.id=comment.article_id")
            .addWhere("article.category_id=?", categoryId)
            .addWhere("article.status=?", "PUBLISHED")
            .addGroupBy("article.id")
            .addOrderBy("article.publishDate DESC")
            .execute(dataSource);
    }

    // Get recent articles with comment counts
    public List<ArticleListView> getRecentArticles(int limit) {
        return PojoQuery.build(ArticleListView.class)
            .addJoin(JoinType.LEFT, "comment", "comment",
                "article.id=comment.article_id")
            .addWhere("article.status=?", "PUBLISHED")
            .addGroupBy("article.id")
            .addOrderBy("article.publishDate DESC")
            .setLimit(limit)
            .execute(dataSource);
    }
}

E-commerce System

Product Catalog

An e-commerce system with products, categories, and inventory:

@Table("product")
public class Product {
    @Id
    Long id;
    String name;
    String description;
    BigDecimal price;
    Integer stock;
    String status;

    @Link
    Category category;

    @Link
    List<Tag> tags;
}

@Table("category")
public class Category {
    @Id
    Long id;
    String name;
    String description;

    @Link
    Category parent;
}

@Table("tag")
public class Tag {
    @Id
    Long id;
    String name;
}

@Table("product_tag")
public class ProductTag {
    @Id
    Long productId;
    @Id
    Long tagId;
}

// Product detail view
class ProductDetail extends Product {
    @Select("COUNT(DISTINCT review.id)")
    Integer reviewCount;

    @Select("AVG(review.rating)")
    Double averageRating;

    @Link
    List<Review> reviews;
}

// Product search view
class ProductSearch extends Product {
    @Select("MATCH(name, description) AGAINST (? IN BOOLEAN MODE)")
    Double relevance;
}

// Usage examples
public class ProductService {
    private final DataSource dataSource;

    public ProductService(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    // Get product with reviews
    public ProductDetail getProduct(Long productId) {
        return PojoQuery.build(ProductDetail.class)
            .addJoin(JoinType.LEFT, "review", "review",
                "product.id=review.product_id")
            .addWhere("product.id=?", productId)
            .addGroupBy("product.id")
            .execute(dataSource)
            .get(0);
    }

    // Search products
    public List<ProductSearch> searchProducts(String query) {
        return PojoQuery.build(ProductSearch.class)
            .addWhere("product.status=?", "ACTIVE")
            .addWhere("MATCH(name, description) AGAINST (? IN BOOLEAN MODE)",
                query)
            .addOrderBy("relevance DESC")
            .execute(dataSource);
    }

    // Get products by category
    public List<Product> getProductsByCategory(Long categoryId) {
        return PojoQuery.build(Product.class)
            .addWhere("product.category_id=?", categoryId)
            .addWhere("product.status=?", "ACTIVE")
            .addOrderBy("product.name")
            .execute(dataSource);
    }
}

Content Management System

Page Management

A CMS with pages, sections, and content blocks:

@Table("page")
public class Page {
    @Id
    Long id;
    String title;
    String slug;
    String status;
    Date publishDate;

    @Link
    User author;

    @Link
    List<Section> sections;
}

@Table("section")
public class Section {
    @Id
    Long id;
    String title;
    String content;
    Integer order;

    @Link
    Page page;
}

@Table("content_block")
public class ContentBlock {
    @Id
    Long id;
    String type;
    String content;
    Integer order;

    @Link
    Section section;
}

// Page detail view
class PageDetail extends Page {
    @Select("COUNT(DISTINCT view.id)")
    Integer viewCount;

    @Link
    List<Section> sections;
}

// Section detail view
class SectionDetail extends Section {
    @Link
    List<ContentBlock> blocks;
}

// Usage examples
public class PageService {
    private final DataSource dataSource;

    public PageService(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    // Get page with sections and blocks
    public PageDetail getPage(String slug) {
        return PojoQuery.build(PageDetail.class)
            .addJoin(JoinType.LEFT, "view", "view",
                "page.id=view.page_id")
            .addWhere("page.slug=?", slug)
            .addWhere("page.status=?", "PUBLISHED")
            .addGroupBy("page.id")
            .execute(dataSource)
            .get(0);
    }

    // Get recent pages
    public List<Page> getRecentPages(int limit) {
        return PojoQuery.build(Page.class)
            .addWhere("page.status=?", "PUBLISHED")
            .addOrderBy("page.publishDate DESC")
            .setLimit(limit)
            .execute(dataSource);
    }

    // Get pages by author
    public List<Page> getPagesByAuthor(Long authorId) {
        return PojoQuery.build(Page.class)
            .addWhere("page.author_id=?", authorId)
            .addOrderBy("page.publishDate DESC")
            .execute(dataSource);
    }
}

Reporting System

Analytics and Reports

A reporting system with metrics and analytics:

@Table("metric")
public class Metric {
    @Id
    Long id;
    String name;
    String type;
    Date timestamp;
    Double value;

    @Link
    Dimension dimension;
}

@Table("dimension")
public class Dimension {
    @Id
    Long id;
    String name;
    String value;
}

// Daily summary view
class DailySummary {
    @Id
    Date date;

    @Select("COUNT(DISTINCT metric.id)")
    Integer metricCount;

    @Select("SUM(metric.value)")
    Double totalValue;

    @Select("AVG(metric.value)")
    Double averageValue;
}

// Usage examples
public class AnalyticsService {
    private final DataSource dataSource;

    public AnalyticsService(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    // Get daily summary
    public List<DailySummary> getDailySummary(Date startDate, Date endDate) {
        return PojoQuery.build(DailySummary.class)
            .addWhere("metric.timestamp BETWEEN ? AND ?",
                startDate, endDate)
            .addGroupBy("DATE(metric.timestamp)")
            .addOrderBy("date DESC")
            .execute(dataSource);
    }

    // Get metrics by dimension
    public List<Metric> getMetricsByDimension(Long dimensionId) {
        return PojoQuery.build(Metric.class)
            .addWhere("metric.dimension_id=?", dimensionId)
            .addOrderBy("metric.timestamp DESC")
            .execute(dataSource);
    }

    // Get latest metrics
    public List<Metric> getLatestMetrics(int limit) {
        return PojoQuery.build(Metric.class)
            .addOrderBy("metric.timestamp DESC")
            .setLimit(limit)
            .execute(dataSource);
    }
}