惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
博客园 - 三生石上(FineUI控件)
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
V
Visual Studio Blog
小众软件
小众软件
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MongoDB | Blog
MongoDB | Blog
V
V2EX
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 【当耐特】
Microsoft Azure Blog
Microsoft Azure Blog
The Cloudflare Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Engineering at Meta
Engineering at Meta
L
LangChain Blog
Martin Fowler
Martin Fowler
GbyAI
GbyAI
博客园 - 司徒正美

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
I Built a Tool That Shows the SQL Behind Any Spring Data ...
Devanshu Biswas · 2026-06-26 · via DEV Community

Devanshu Biswas

Spring Data JPA has one genuinely magical feature: you declare a query by naming a method. No SQL, no @Query, no implementation.

interface OrderRepository extends JpaRepository<Order, Long> {
    List<Order> findByStatusAndCustomerOrderByCreatedAtDesc(OrderStatus status, String customer);
}

Spring reads that name at startup and writes the query for you. It's wonderful — right up until you hit a method name and think "...wait, what does that actually generate?"

So I built a tool that shows you, live: type a method name, watch the JPQL and SQL appear.

▶ Live demo: https://dev48v.github.io/sql-to-jpa/
Source (zero dependencies): https://github.com/dev48v/sql-to-jpa

How the derivation works

Spring splits the method name into three parts:

find  By  StatusAndCustomer  OrderByCreatedAtDesc
└subject┘  └─── predicates ───┘ └──── sorting ────┘

  1. Subjectfind / read / get / query / count / exists / delete, plus optional Distinct and Top/First limits.
  2. Predicates — properties joined by And / Or, each with an optional operator keyword.
  3. OrderBy — one or more properties, each Asc or Desc.

The example above becomes:

select o.* from orders o
where o.status = ? and o.customer = ?
order by o.created_at desc

The keywords are the whole language

The operator is a suffix on the property name, and there are a lot of them:

Method fragment SQL
QuantityGreaterThan quantity > ?
CreatedAtBetween created_at between ? and ?
CustomerContaining `customer like '%'\
{% raw %}StatusIn status in (?)
ItemIsNull item is null
ActiveTrue active = true
CustomerIgnoreCase upper(customer) = upper(?)

A couple of things that trip people up, made visible in the tool:

  • Between and In change the parameter type. Between takes two args; In takes a Collection. The generated signature reflects that.
  • The return type comes from the subject. count…long, exists…boolean, findFirst…/findTop1…Optional<T>, otherwise List<T>.
  • Top3 adds a limit that lives in SQL, not JPQL.

Why type it out instead of reading the docs

The grammar is simple in principle and fiddly in practice — GreaterThanEqual vs GreaterThan, where IgnoreCase goes, what Containing does with %. Poking at a live parser and watching the SQL change as you edit the name is faster than scanning a reference table, and it sticks better.

It's one index.html, no build, no dependencies — best-effort over a sample Order entity with the default camelCase → snake_case column naming.

If this saved you a "what does this generate?" moment, a star helps others find it: https://github.com/dev48v/sql-to-jpa