{"id":19762587,"url":"https://github.com/heliorm/heliorm","last_synced_at":"2026-01-11T16:57:59.036Z","repository":{"id":39928636,"uuid":"178557079","full_name":"HeliORM/HeliORM","owner":"HeliORM","description":"A code-first object-relational model for accessing SQL data from Java","archived":false,"fork":false,"pushed_at":"2024-11-10T11:59:38.000Z","size":1115,"stargazers_count":1,"open_issues_count":10,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-01-10T23:42:29.676Z","etag":null,"topics":["java","orm","sql"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HeliORM.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-03-30T12:41:34.000Z","updated_at":"2024-11-10T11:59:42.000Z","dependencies_parsed_at":"2023-11-23T19:59:07.285Z","dependency_job_id":"37c8dd7b-c0d7-4714-9bc1-68e4461067db","html_url":"https://github.com/HeliORM/HeliORM","commit_stats":null,"previous_names":["gideonlegrange/heliorm"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HeliORM%2FHeliORM","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HeliORM%2FHeliORM/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HeliORM%2FHeliORM/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HeliORM%2FHeliORM/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HeliORM","download_url":"https://codeload.github.com/HeliORM/HeliORM/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241094641,"owners_count":19908674,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","orm","sql"],"created_at":"2024-11-12T04:05:14.055Z","updated_at":"2026-01-11T16:57:59.030Z","avatar_url":"https://github.com/HeliORM.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# HeliORM\n\n[![Java CI with Maven](https://github.com/HeliORM/HeliORM/actions/workflows/maven.yml/badge.svg)](https://github.com/HeliORM/HeliORM/actions/workflows/maven.yml)\n\nHeliORM is a **code-first** object-relational model for accessing SQL data from Java. It allows **compile time type\nsafe** SQL queries from Java code.\n\nHere is an example of a type safe query in Java:\n\n```java\n        List\u003cCat\u003e all = orm().select(CAT)\n                .where(CAT.type.eq(CatType.INDOOR))\n                .join(PERSON).on(CAT.personId, PERSON.id)\n                .where(PERSON.emailAddress.eq(person.getEmailAddress()))\n                .orderBy(CAT.name, CAT.age.desc())\n                .list();\n```\n\nIf you find this example interesting, read on.\n\nThe idea is that you write your plain old Java Objects (POJOs), and then generate a supporting data model that allows\ntype-safe queries, and then use this model and a very simple API to do Structured Query Language (SQL) queries and\nupdates. It is focussed on working with POJOs and is intended to make create, update, read, delete (CRUD) operations\neasy. It is not meant to be a complete implementation of SQL in Java.\n\nHeliORM also supports querying on abstract data types.\n\n:warning: This page is currently **very** incomplete\n\n## Getting HeliORM\n\nI recommend using Maven or your prefered package management technology to add HeliORM To your project. You'll need at\nleast the `core` library, and most likely a SQL driver library, and if you wish to use annotations in your POJOs, the\nannotation library.\n\n### The core library\n\n```xml\n  \u003cdependency\u003e\n    \u003cgroupId\u003ecom.heliorm\u003c/groupId\u003e\n     \u003cartifactId\u003ecore\u003c/artifactId\u003e\n     \u003cversion\u003e0.91\u003c/version\u003e\n  \u003c/dependency\u003e\n```\n\n### Annotations to annotate your POJOs\n\n```xml\n  \u003cdependency\u003e\n    \u003cgroupId\u003ecom.heliorm\u003c/groupId\u003e\n     \u003cartifactId\u003eannotation\u003c/artifactId\u003e\n     \u003cversion\u003e0.9\u003c/version\u003e\n  \u003c/dependency\u003e\n```\n\n### The MySQL driver\n\n```xml\n  \u003cdependency\u003e\n    \u003cgroupId\u003ecom.heliorm\u003c/groupId\u003e\n     \u003cartifactId\u003emysql\u003c/artifactId\u003e\n     \u003cversion\u003e0.9\u003c/version\u003e\n  \u003c/dependency\u003e\n```\n\n## Quick CRUD examples\n\nIn these examples we have a POJO class called `Dog` and a running ORM referenced by `orm`.\n\nClass `Dog` can more or less look like this:\n\n```java\n@Pojo\npublic class Dog {\n    @PrimaryKey(autoIncrement = true)\n    private Long id;\n\n    @ForeignKey(pojo = Person.class)\n    private Long personId;\n    @Column(length = 32)\n    private String name;\n    private int age;\n}   \n```\n\n`Dog` is annotated with `@Pojo` and some of it's fields are annotated as well. We'll explain more about annotations\nlater\n\n### Create\n\nCreate a new 3-year old dog, and call it 'Fido':\n\n```java\n   Dog dog = new Dog();\n   dog.setName(\"Fido\"); // The classics are the best\n   dog.setAge(3);\n   dog.setPersonId(1);\n   // code ommitted to set values in dog \n   dog = orm.create(dog);\n```\n\n### Read\n\nRead the dog called 'Fido':\n\n```java \n   Dog dog = orm.select(DOG)\n   .where(DOG.name.eq(\"Fido\"))\n   .one();\n```\n\n### Update\n\nChange a dog's name and save it:\n\n```java \n   // assume variable dog references a Dog object is loaded \n   dog.setName(\"Rex\"); // I've renamed a dog IRL once \n   dog = orm.update(dog);\n```\n\n### Delete\n\nDelete a dog:\n\n```java\n   // assume variable dog references a Dog object is loaded \n   orm.delete(dog); // Rip Rex \n```\n\n## Retrieving data as lists, streams, singletons or optionals\n\n### Retrieve a list of data\n\nGet all dogs in any order as a list:\n\n```java\nList\u003cDogs\u003e dogs = orm.select(DOG).list();\n```\n\n### Get a single object\n\nGet dog with ID 10 if you're sure it exists. If it doesn't exist, an exception will be thrown.\n\n```java\n\nDog dog = orm.select(DOG)\n                .where(DOG.id.eq(10L)\n                .one();\n```\n\n### Get an optional object\n\nGet dog with ID 10 if you're not sure it exists. If it doesn't exist, an empty `Optional` is returned.\n\n```java\nOptional\u003cDog\u003e optDog =  orm.select(DOG)\n                .where(DOG.id.eq(10L)\n                .optional();\n```\n\n### Retrieve data as a stream\n\nGet all dogs in any order as a stream:\n\n```java\nStream\u003cDogs\u003e dogs = orm.select(DOG).stream();\n```\n\n## Ordering\n\n### Order by sinlge column/field in ascending order\n\nGet all dogs ordered by name:\n\n```java\nList\u003cDog\u003e alphaDogs = orm.select(DOG)\n   .orderBy(DOG.name)\n   .list();\n```\n\n### Order by one column/field in descending order\n\nGet all dogs ordered from oldest to youngest:\n\n```java\nList\u003cDog\u003e dogHierarchy = orm.select(DOG)\n   .orderBy(DOG.age.desc())\n   .list();\n```\n\n### Order by a column/field in descending order, other in ascending\n\nGet all dogs ordered from oldest to youngest:\n\n```java\nList\u003cDog\u003e dogHierarchy = orm.select(DOG)\n   .orderBy(DOG.age.desc(), DOG.name)\n   .list();\n```\n\n## Joining data\n\nKeep in mind what `Dog` looks like, and take a look at `Person`:\n\n```java\n@Pojo\npublic class Person {\n\n\n    @PrimaryKey\n    private Long id;\n    @ForeignKey(pojo = Town.class)\n    private Long townId;\n    @Column\n    private String firstName;\n    @Column(nullable = true)\n    private String lastName;\n    @Column\n    private String emailAddress;\n    @Column(nullable = true)\n    private Double income;\n\t\n}\n\n````\n\n### Select on a joined selection table\n\nGet all dogs owned by Bob:\n\n```java\nList\u003cDog\u003e bobsDogs = orm.select(DOG)\n    .join(PERSON).on(DOG.personId, PERSON.id)\n    .where(PERSON.name.eq(\"Bob\"))\n    .list();\n```\n\n### Select on the result table and joined selection table\n\nGet all dogs older than 2 years owned by Bob\n\n```java\nList\u003cDog\u003e bobsDogs = orm.select(DOG)\n\t.where(DOG.age.gt(2))\n    .join(PERSON).on(DOG.personId, PERSON.id)\n    .where(PERSON.name.eq(\"Bob\"))\n    .list();\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fheliorm%2Fheliorm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fheliorm%2Fheliorm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fheliorm%2Fheliorm/lists"}